首先,我道歉,我是一个极端的初学者,所以我可能听起来很无知。
我有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
还是我离开了?任何帮助表示赞赏。谢谢!
答案 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 post和this one。