2015-02-10 2 views
0

Im пытается подсчитать значения в огромном списке, используя предопределенный список.Подсчет с использованием предопределенного списка

Предустановленные список значений для подсчета: 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 очень большой. Есть ли быстрый питонический способ сделать это? Я не могу использовать collections Counter, так как он не возвращает мне 0s для значений, которые присутствуют в p, но не в h.

+0

как об использовании Dict, р = { "а": 0, "B": 0, "C": 0}; для i в h: если i в p: p [i] + = 1 –

+0

@AnkushShah Отказ, пожалуйста. –

+0

@LutzHorn: кажется, что отступы не работают в комментариях. –

ответ

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] для k в p]' для соответствия выходному сигналу OP –

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 in p' равен O (1) вместо O (len (p)). –

+0

@mu 無 Хорошая идея, отредактирована. –

+0

вы можете просто найти в dict c, что также будет O (1). нет необходимости в наборе –

2

инициализировать словарь, используя пункты 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)