2013-05-15 153 views
3

内增加defaultdict我有这样的:列表理解(Python)的

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

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

这是一个语法错误:

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

顺便说一句,为什么不能列表理解中的一个使用表达式这样吗?这很简单,并且会大大改善这种代码的简洁性和性能。

+1

为什么你认为这会提高性能?你仍然需要迭代self.lines,现在你已经介绍了创建一个你以前没有的列表的开销。而且它不再简洁:您将一个冒号和一个换行换成了一对方括号。 – chepner

+0

@chepner,在你写你的同时,我在答案中加了一个类似的注释;) – shx2

回答

3

你的列表中理解不工作,因为工作分配不表达。

您不应该使用列表理解来替换循环。写一个循环。列表解析用于构建列表。

为什么你认为列表理解会提高性能?如果有的话,它可能会损害性能,因为它需要分配并分配给它构建的临时列表,而这个临时列表从未被使用过。想象一下,你的原始列表中有1,000,000,000行。

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不支持的任务,甚至使用信用证的副作用也是一个不好的做法。

lis = [] 
[lis.append(x) for x in xrange(5)] #bad 

阅读:Is it Pythonic to use list comprehensions for just side effects?