2015-02-10 60 views
0

我试图使用预定义列表来计算巨大列表中的值。要计算的值的使用预定义列表计数

预设列表:p = ['a', 'b', 'c']

在其计数是要做巨大的名单:h = ['a', 'c', 'd', 'c'.....]

目前即时通讯使用

count = [] 
for item in p: 
    count.append(h.count(item)) 

Out: count = [1,0,2] 

这种方法,但是,很慢如果h非常大。有没有一种快速pythonic的方式来做到这一点?我不能使用collections Counter,因为它不会为p中的值返回0,而不会返回h

+0

如何有关使用字典, P = { “一”:0, “B”:0, “C”:0}; 我在h: 如果我在p: p [i] + = 1 – 2015-02-10 11:52:30

+0

@AnkushShah请注意。 – 2015-02-10 11:53:00

+0

@LutzHorn:似乎缩进在注释中不起作用 – 2015-02-10 11:55:12

回答

3

我会用Counter无论如何,然后强迫Counter表现得像你想要的。实际上,Counter已默认为其从未计数的任何项目打印0。

import collections 

p = ['a', 'b', 'c'] 
h = ['a', 'c', 'd', 'c'] 

c = collections.Counter(h) 
print c 

for i in p: 
    print i, c[i] 

输出:

Counter({'a': 1, 'c': 2, 'd': 1}) 
a 1 
b 0 
c 2 
+1

或'[c [k] for k in p]'来匹配OP的输出 – 2015-02-10 12:15:10

1

只有一次循环:

In [2]: h = ['a', 'c', 'd', 'c'] 

In [8]: p = ['a', 'b', 'c'] 

In [9]: c = {x:0 for x in p} 

In [10]: for x in h: 
    if x in c: 
     c[x] += 1 
    ....:   

In [11]: c 
Out[11]: {'a': 1, 'b': 0, 'c': 2} 
+0

你实际上可以将'p'定义为一个集合,这样查找x中的p就是O(1)而不是O(len(p))。 – 2015-02-10 11:53:59

+0

@mu无好主意,编辑。 – 2015-02-10 11:56:06

+0

你可以在字典c中查找,也可以是O(1)。无需设置 – 2015-02-10 11:59:43

2

Intialize使用p项目与0键的值,然后在h循环,并检查当前的产品在字典词典,如果是,增加它的值:

>>> p = ['a', 'b', 'c'] 
>>> h = ['a', 'c', 'd', 'c'] 
>>> c = dict.fromkeys(p, 0) 
>>> for x in h: 
...  if x in c: 
...   c[x] += 1 
...   
>>> c 
{'a': 1, 'c': 2, 'b': 0} 
# ... 
>>> from operator import itemgetter 
>>> itemgetter(*p)(c) 
(1, 0, 2)