找到集合和奖励点之间的交集

时间:2013-12-03 04:16:14

标签: python set intersection

首先,我道歉,我是一个极端的初学者,所以我可能听起来很无知。

我有5个单词集。其中4个是通过csv导入的,另一个是根据用户输入创建的。我想找到输入集和其他每个集之间的交集。然后根据有多少交叉点奖励积分。

例如,我想找到“set_1”和“input_set”之间的交叉点。对于每个交叉点,将1添加到user_score。然后,找到“set_2”和“input_set”之间的交集,并为每个交叉点添加2到user_score。等等,每个交叉点增加4个。

我会使用if循环还是for循环?

这样的东西?

user_score = 0

for x in intersect(input_set, set_1):
    user_score += 1
for x in intersect(input_set, set_2):
    user_score += 2
for x in intersect(input_set, set_3):
    user_score += 3
for x in intersect(input_set, set_4):
    user_score += 4

还是喜欢这个?

if intersect(input_set, set_1):
    user_score += 1
elif intersect(input_set, set_2):
    user_score += 2
elif intersect(input_set, set_3):
    user_score += 3
elif intersect(input_set, set_4):
    user_score += 4

还是我离开了?任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:3)

此:

for intersect(input_set, set_1):

...不是循环如何工作。你需要一个循环变量,如下所示:

for thing_in_both_sets in intersect(input_set, set_1):
    user_score += 1

如果您不关心“事物”是什么,可以将其称为_。这没有任何特殊含义,但通常它意味着它是一个无用的虚拟变量:

for _ in intersect(input_set, set_1):
    user_score += 1

同时,如果你使用内置的set类型,则没有名为intersect的函数,但是有一个名为intersection方法,你可以像这样使用:

for _ in input_set.intersection(set_1):

您也可以将其拼写为&运算符。


然而,如果你考虑一下,有一个更快的方法来做到这一点:而不是循环,只需得到交叉点的len。所以:

user_score += len(input_set & set_1)
user_score += len(input_set & set_2) * 2
# etc.

最后一个改进:为什么不只有一组集合,而不是为四个集合分别设置四个变量?您是否还有四个复制并粘贴了轻微变化的代码块来创建单独的变量?如果是这样,摆脱它们。然后你可以这样做:

user_score = 0
for multiplier, user_set in enumerate(user_sets, 1):
    user_score += len(input_set & user_set) * multiplier

即使您有单独的变量,也可以随时创建user_set,如下所示:

user_sets = (set_1, set_2, set_3, set_4)

但最好只有一个集合列表,而不是四个单独的变量。有关此问题的详细讨论,请参阅this blog postthis one