6

我有这个:

   self.lines = [...]
   cnt = defaultdict(int)
   for line in self.lines:
       cnt[line] += 1

现在这行得通。但我想知道是否可以使用列表理解来完成它(增加 defaultdict 中特定行的计数)?

这是一个语法错误:

   [cnt[line] += 1 for line in self.lines]

顺便说一句,为什么不能在列表理解中使用这样的表达式?它很简单,并且会大大提高此类代码的简洁性和性能。

4

2 回答 2

5

您的列表理解不起作用,因为分配不是表达式。

您不应该使用列表推导来替换循环。写一个循环。列表推导用于构造列表。

为什么你认为列表理解会提高性能?如果有的话,它可能会损害性能,因为它需要分配并分配给它构建的临时列表,然后永远不会使用它。假设您的原始列表中有 1,000,000,000 行。

于 2013-05-15T14:28:55.107 回答
4

你可以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

阅读:将列表推导用于副作用是 Pythonic 吗?

于 2013-05-15T14:26:33.927 回答