【发布时间】:2018-01-25 23:11:19
【问题描述】:
请帮助我了解为什么会这样。下面的代码列出了迭代中的重复项。但是,使用 or 运算符的行为类似于 if..else 语句中的 else..
j = set()
my_list = [1, 2, 3 ,3 , 3 ,4, 4]
j_add = j.add
twice = set(x for x in my_list if x in j or j_add(x))
print list(twice)
希望该行是:
twice = set(x for x in my_list if x in j else j_add(x))
思考或返回布尔值而不是值
【问题讨论】:
-
从技术上讲,你没有列表理解,你有一个生成器表达式。
-
不,
or不是else语句。这是测试的一部分。您可以在任何if或while语句中使用相同的布尔表达式。or短路,如果左边的表达式产生一个真值,它将不会执行右边的表达式。 -
谢谢..目标不是删除重复项,而是捕获它们。上面的代码在执行时会返回[3, 4]。
-
对,如果您想捕获多次出现的项目,请使用
Counter()并过滤结果计数。这会导致代码更简洁。 -
我通常反过来说。试试这个:两次 = set(x if x in j else j_add(x) for x in my_list)
标签: python python-2.7 generator-expression