首先,列表推导通常很容易阅读,这里有一个简单的例子:
[x for x in seq if x != 2]
翻译为:
result = []
for x in seq:
if x != 2:
result.append(x)
您无法阅读此代码的原因是因为它不是我在此问题中所述的可读和hacky代码:
def f8(seq):
seen = set()
return [x for x in seq if x not in seen and not seen.add(x)]
翻译为:
def f8(seq):
seen = set()
result = []
for x in seq:
if x not in seen and not seen.add(x): # not seen.add(...) always True
result.append(x)
并且依赖于这样一个事实,set.add
即始终返回的就地方法,None
因此not None
计算结果为True
.
>>> s = set()
>>> y = s.add(1) # methods usually return None
>>> print s, y
set([1]) None
以这种方式编写代码的原因是为了偷偷利用 Python 的列表理解速度优化。
None
如果 Python 方法修改了数据结构,它们通常会返回(pop
是例外之一)
我还注意到,当前接受的执行此操作 ( 2.7+
) 的方式更易读且不使用hack,如下所示:
>>> from collections import OrderedDict
>>> items = [1, 2, 0, 1, 3, 2]
>>> list(OrderedDict.fromkeys(items))
[1, 2, 0, 3]
字典键必须是唯一的,因此会过滤掉重复项。