2017-01-31 20 views
2

мне нужно преобразовать следующий список:Python вложенного список понимания для подсчета вхождений одной строки по спискам

[ 
    [u'starred', u'review'], 
    [u'starred', u'review'], 
    [u'starred', u'review', u'pinned'], 
    [u'starred'], 
    [u'starred'], 
    [u'starred', u'review'] 
] 

в следующем Словарь

{ 
    u'starred': 6, 
    u'review': 4, 
    u'pinned': 1 
} 

У меня есть ощущение, что он должен возможно, используя понимание списка или выражение генератора, но я не уверен, хотя.

Любые идеи?

ответ

6

Как насчет

import itertools, collections 
c = collections.Counter(itertools.chain(*your_list)) 
+0

Это идеальный вариант. Дожидаться других ответов до принятия. –

+2

Вместо 'chain (* your_list)' вы можете использовать 'chain.from_iterable (your_list)', но это всего лишь незначительная точка. Хороший ответ! – MSeifert

+0

Ничего себе, через менее чем 2 минуты уже 5 upvotes? Это быстро. – ChatterOne

1

Свести вам список с выражением генератора и использовать collections.Counter:

from collections import Counter 

Counter(x for sub in L for x in sub) 
+0

Две причины для принятия этого ответа: во-первых, это быстрее. В быстрых тестах я получаю 1.08 сек для этого против 1.42 с помощью 'itertools.chain'. Во-вторых: в то время как это не так важно, и ответ 'itertools' становится более чистым (проще понять на коротком глиппиксе), это по-прежнему остается ответом, который показывает, как на самом деле использовать выражения вложенного списка/генератора. –

+0

@ DanielF Какой у вас тест? Для '[map (unicode, range (1000)) для _ в диапазоне (1000)]', 'itertools' быстрее для меня (около 2,71 секунды против 2,99 секунды (для десяти исполнений)). –

+0

Я за диапазон (1000) - обнуление результата извлечения базы данных. Если вы хотите, чтобы я мог поместить результат базы данных в файл json и отправить его в pastebin. Кроме того, я покидаю счетчик. 'list (itertools.chain (* your_list))' vs '[x для sub в вашем_list для x в sub]'. Сегодня я сделаю двойной выбор, чтобы не оставить на вас бремя. Спасибо за информацию. –