Python中的多个集合运算

问题描述 投票:0回答:9

我是Python新手,现在正在学习它。我在网上练习时遇到了以下问题。然而,我试图解决这个问题,尽管我得到了预期的结果,但在线验证器却说这是错误的。请指出我哪里出错了。

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++

在一所学校里,共有 20 名学生,编号从 1 到 20。你会得到三个列表,分别名为“C”、“F”和“H”,分别代表打板球、足球和曲棍球的学生。根据此信息,找出并打印以下内容:

  • 参加所有三项运动的学生
  • 同时打板球和足球但不打曲棍球的学生
  • 参加其中两项运动的学生
  • 不参加这三项运动中任何一项的学生

格式:

输入:

3 个列表,其中包含分别代表打板球、足球和曲棍球的学生的数字(范围从 1 到 20)。

输出:

根据问题中提供的限制,包含学生的 4 个不同列表。

示例: 输入:

[[2, 5, 9, 12, 13, 15, 16, 17, 18, 19]
[2, 4, 5, 6, 7, 9, 13, 16]
[1, 2, 5, 9, 10, 11, 12, 13, 15]] 

预期输出:

[2, 5, 9, 13]
[16]
[12, 15, 16]
[3, 8, 14, 20]

下面是我的代码

C = set(input_list[0])
F = set(input_list[1])
H = set(input_list[2])
A= set(range(1, 21))

print(sorted(list(C & F & H)))
print(sorted(list((C & F) - H)))
print(sorted(list(((C-F)&H | (C-H)&F))))
print(sorted(list(A-(C|F|H))))

我不确定A是否真的需要。

谢谢,

python python-3.x set
9个回答
4
投票

除了参加其中两项运动的学生之外,您对所有其他人的看法都是正确的,这应该是:

(C|F|H) - (C^F^H)

3
投票
import ast,sys

input_str = sys.stdin.read()
input_list = ast.literal_eval(input_str)

C = input_list[0]
F = input_list[1]
H = input_list[2]
C = set(input_list[0])
F = set(input_list[1])
H = set(input_list[2])

print(sorted(list(C & F & H)))
print(sorted(list((C & F) - (C & F & H))))
print(sorted(list(((C & F) | (F & H) | (C & H)) - (C & F & H))))
print(sorted(list(set(range(1,21)) - (C | F | H))))

2
投票

如果没有 A 组,结果应该会突然找到预期的学生,因为他们不属于任何其他组(根据定义)。 因此,A 组确实需要包含不属于其他组的学生。


2
投票
print(sorted(list(set(C)&set(F)&set(H))))

print(sorted(list(set(C)&set(F)-set(H))))

y=set(C)&set(F)&set(H)

print(sorted(list(((set(C)&set(F))|(set(H)&set(F))|(set(C)&set(H)))-y)))

print(sorted(list(A-(set(C)|set(F)|set(H)))))

2
投票
# Read the three input lists, i.e. 'C', 'F', and 'H'.

C = input_list[0]
F = input_list[1]
H = input_list[2]

# Write your code here
CS=set(C)
FS=set(F)
HS=set(H)
CHF=set(range(1,21))

A=(CS.intersection(FS.intersection(HS)))
B=((FS.intersection(CS))-CS.intersection(FS.intersection(HS)))
C=((((CS-FS).intersection(HS)).union((HS-CS).intersection(FS))).union((FS-HS).intersection(CS)))
D=(CHF-(CS.union(FS.union(HS))))

print(sorted(list(A)))
print(sorted(list(B)))
print(sorted(list(C)))
print(sorted(list(D)))

1
投票
input_list_c = [2, 5, 9, 12, 13, 15, 16, 17, 18, 19]
input_list_f = [2, 4, 5, 6, 7, 9, 13, 16, 20]
input_list_h = [1, 2, 5, 9, 10, 11, 12, 13, 15, 20]

mc = max(input_list_c)
mf = max(input_list_f)
mh = max(input_list_h)

if mc > mf & mc > mh:
    m = mc
elif mf > mc & mf > mh:
    m = mf
else:
    m = mh

nc = min(input_list_c)
nf = min(input_list_f)
nh = min(input_list_h)

if nc < nf & nc < nh:
    n = nc
elif nf < nc & nf > nh:
    n = nf
else:
    n = nh

C = set(input_list_c)
F = set(input_list_f)
H = set(input_list_h)
A = set(range(n,m))
Y = (C&F&H)

print(sorted(list(Y)))
print(sorted(list((C&F)-H)))
print(sorted(list((C&F|C&H|F&H)-Y)))
print(sorted(list(A-(C|F|H))))

0
投票

处理同样的问题,我发现答案缺乏解释,导致很难理解发生了什么,所以我将发布我的代码并解释我如何解决问题。

上下文代码:

C = input_list[0]
F = input_list[1]
H = input_list[2]

set_C = set(C)
set_F = set(F)
set_H = set(H)
set_all = set([x for x in range(1,21)])

参加所有三项运动的学生:我们只需取所有 3 组运动的交集即可得出答案。

all_three_sports = set_C.intersection(set_F,set_H)

同时打板球和足球但不打曲棍球的学生: 我们可以取踢足球的球员集合和打板球的球员集合的交集,然后减去打曲棍球的球员集合。

c_and_f_but_not_h = (set_F.intersection(set_C)).difference(set_H)

只参加其中两项运动的学生:为此,我们取踢足球和曲棍球的运动员集合的交集,然后减去打板球的运动员集合。其次,我们取打板球和曲棍球的球员集合的交集,然后减去打足球的球员集合。最后,我们取踢足球和板球的球员集合的交集,然后减去打曲棍球的球员集合。

正如我们所看到的,这给我们留下了三组只参加两项运动的球员。我们通过合并所有结果得到答案。

only_two_sports = (set_C.intersection(set_F)-set_H).union((set_H.intersection(set_F)-set_C),(set_C.intersection(set_H)-set_F))

不参加这三种运动中任何一项的学生:这里我们只需将我们收到的所有球员组的并集与球员总数相减即可。

neither_sports = set_all - (set_C.union(set_F,set_H))

现在,我们只需将集合转换为列表并在打印之前对它们进行排序:

print(sorted(list(all_three_sports)))
print(sorted(list(c_and_f_but_not_h)))
print(sorted(list(only_two_sports)))
print(sorted(list(neither_sports)))

0
投票
C = input_list[0]
F = input_list[1]
H = input_list[2]

C = set(input_list[0])
F = set(input_list[1])
H = set(input_list[2])
print(sorted(list(C & F & H)))
print(sorted(list((C & F) - (C & F & H))))
print(sorted(list(((C & F) | (F & H) | (H & C)) - (C&F&H))))
print(sorted(list(set(range(1,21)) -(C | F | H))))

0
投票

打印(排序(列表(集(C).交集(F).交集(H))))

打印(排序(列表(集合(C).交集(F).差异(H))))

打印(排序(列表(集(C)。交集(F)。联合(集(F)。交集(H))。联合(集(C)。交集(H))。差异(集(C)。交叉点(F).交叉点(H)))))

打印(排序(列表(集合(范围(1,21))。差异(集合(C)。联合(F)。联合(H)))))

© www.soinside.com 2019 - 2024. All rights reserved.