2014-01-10 4 views
0

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

foo = [[('a',),('a','b'),('a','b','c'),('b','c'),('c',)],[('a',),('a','b')]] 

Ожидаемые результаты:

('a',)  2 
('a','b')  2 
('a','b','c') 1 
('b','c')  1 
('c',)  1 

Любая помощь приветствуется.

ответ

2

Использование collections.Counter:

>>> import itertools 
>>> import collections 
>>> 
>>> foo = [[('a',),('a','b'),('a','b','c'),('b','c'),('c',)],[('a',),('a','b')]] 
>>> for x, cnt in collections.Counter(itertools.chain.from_iterable(foo)).most_common(): 
...  print(x, cnt) 
... 
('a',) 2 
('a', 'b') 2 
('a', 'b', 'c') 1 
('c',) 1 
('b', 'c') 1 
1

Вы должны объединить все списки в один, а затем вы можете использовать Collections.Counter, как этот

foo = [[('a',),('a','b'),('a','b','c'),('b','c'),('c',)],[('a',),('a','b')]] 
from collections import Counter 
print Counter(item for items in foo for item in items) 

Выход

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

Тот же результат может быть достигнут wi го нормального dict, а

result = {} 
for items in foo: 
    for item in items: 
     result[item] = result.get(item, 0) + 1 
print result 

Выход

{('b', 'c'): 1, ('c',): 1, ('a', 'b'): 2, ('a',): 2, ('a', 'b', 'c'): 1} 
Смежные вопросы