2015-02-10 38 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)