Счетчик коллекций над списком кортежей - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь настроить счетчик Python на список кортежей.

ListOfTuples = [('Good', 'Bad', 'Ugly'),('East', 'West', 'South'), ('Good', 'Bad', 'Ugly'), ('NewYork', 'Berlin', 'Austria'),('Good', 'Bad', 'Ugly')]

Я ищу простой счетчик, который выбрасывает:

('Good', 'Bad', 'Ugly') = 3
('East', 'West', 'South') = 1
('NewYork', 'Berlin', 'Austria') = 1

Когда я посмотрел вверх на SO, я нашел следующий, который работает между кортежами:

def count_ngrams(iterable, n=2):
    return Counter(zip(*[islice(iterable, i, None) for i in range(n)]))
count_ngrams(iterable, n=2)

Когда я запустил приведенный выше код на примере, я получаю

Counter({(('Good', 'Bad', 'Ugly'), ('East', 'West', 'South')): 1, (('East', 'West', 'South'), ('Good', 'Bad', 'Ugly')): 1, (('Good', 'Bad', 'Ugly'), ('NewYork', 'Berlin', 'Austria')): 1, (('NewYork', 'Berlin', 'Austria'), ('Good', 'Bad', 'Ugly')): 1})

Ответы [ 4 ]

1 голос
/ 13 января 2020

Попробуйте код ниже,

from collections import Counter
ListOfTuples = [('Good', 'Bad', 'Ugly'),('East', 'West', 'South'), ('Good', 'Bad', 'Ugly'), ('NewYork', 'Berlin', 'Austria'),('Good', 'Bad', 'Ugly')]
dict(Counter(ListOfTuples))

Выход

{('Good', 'Bad', 'Ugly'): 3,
 ('East', 'West', 'South'): 1,
 ('NewYork', 'Berlin', 'Austria'): 1}
1 голос
/ 13 января 2020

Если вы ищете итеративное решение:

import collections
ListOfTuples = [('Good', 'Bad', 'Ugly'),('East', 'West', 'South'), ('Good', 'Bad', 'Ugly'), ('NewYork', 'Berlin', 'Austria'),('Good', 'Bad', 'Ugly')]

Occurences = collections.defaultdict(int)

for item in ListOfTuples:
    Occurences[item] +=1
print(Occurences)

Выводится как:

>> defaultdict(<class 'int'>, {('Good', 'Bad', 'Ugly'): 3, ('East', 'West', 'South'): 1, ('NewYork', 'Berlin', 'Austria'): 1})
1 голос
/ 13 января 2020

Просто используйте dict(Counter(ListOfTuples)), который возвращает словарь, а не объект Counter.

O / P:

{('Good', 'Bad', 'Ugly'): 3,
 ('East', 'West', 'South'): 1,
 ('NewYork', 'Berlin', 'Austria'): 1}
1 голос
/ 13 января 2020

Просто позвоните Counter() в списке кортежей:

Counter(ListOfTuples)

Что даст вам:

Counter({('Good', 'Bad', 'Ugly'): 3, ('East', 'West', 'South'): 1, ('NewYork', 'Berlin', 'Austria'): 1})
...