2014-03-13 2 views
1

У меня есть объект Counter(), который дает мне количество вхождений списка строк. И у меня есть уникальный список строк. И мне нужно привести список счетчиков из счетчика, а затем поместить нули в другие строковые экземпляры с 0 подсчетами.Как создать список счетчиков из уникального списка и объекта Counter?

Я могу сделать это следующим образом, но могу ли я достичь того же z списка в более эффективном/путинском режиме?

from collections import Counter 
x = Counter(['abc','def','abc']) 
uniq = sorted(set(['abc', 'def', 'abc', 'abc', 'ghi', 'jkl','jkl'])) 
z = [x[i] for i in uniq] 

Выход

>>> z 
[2, 1, 0, 0] 
>>> uniq 
['abc', 'def', 'ghi', 'jkl'] 

На самом деле конечная цель состоит в том, чтобы получить np.array(z) и np.array(uniq)

+1

Мое мнение таково, что ваш самый лучший путь. Если ваш второй список длинный, вы можете заменить 'np.array (sorted (set (...)))' with 'np.unique (...)' – askewchan

ответ

2

Я полагаю, вы могли бы использовать update метод Counter «s, чтобы добавить 0 для всех ключей в уникальный список

>>> from collections import Counter 
>>> x = Counter(['abc','def','abc']) 
>>> y = ['abc', 'def', 'abc', 'abc', 'ghi', 'jkl','jkl'] 
>>> x.update(dict.fromkeys(y, 0)) 

Так, чтобы x теперь содержит ключи и значения, которые вы хотите.

Или, если вы хотите, чтобы избежать строительства промежуточного dict, чуть длиннее:

>>> from collections import Counter 
>>> x = Counter(['abc','def','abc']) 
>>> y = ['abc', 'def', 'abc', 'abc', 'ghi', 'jkl','jkl'] 
>>> for k in y: 
     x[k] += 0 
+0

Приятно, тогда вы можете сделать 'u, z = np .array (zip (x.items) .T'. Все еще не так быстро, как OP. – askewchan

Смежные вопросы