我有这个:
self.lines = [...]
cnt = defaultdict(int)
for line in self.lines:
cnt[line] += 1
现在这个有效。但是我想知道它是否可以使用列表推导来完成(增加defaultdict中特定行的计数)?
这是语法错误:
[cnt[line] += 1 for line in self.lines]
顺便说一句,为什么不能在列表理解中使用这样的表达式?这很简单,并且会极大地改善这些代码的简洁性和性能。
答案 0 :(得分:4)
您的列表理解不起作用,因为作业不是表达式。
您不应该使用list comprehension来替换循环。写一个循环。列表推导用于构建列表。
为什么您认为列表理解会提高性能?如果有的话,它可能会损害性能,因为它需要分配并分配给它构建的临时列表,然后从不使用它。想象一下,原始列表中有1,000,000,000行。
答案 1 :(得分:3)
您可以在此处使用collections.Counter
:
>>> from collections import Counter
>>> lis = [1,2,3,3,3,5,6,1,2,2]
>>> Counter(lis)
Counter({2: 3, 3: 3, 1: 2, 5: 1, 6: 1})
cnt[line] += 1
是一项任务,LC不支持作业,甚至使用LC进行副作用也是一种不好的做法。
lis = []
[lis.append(x) for x in xrange(5)] #bad
阅读:Is it Pythonic to use list comprehensions for just side effects?