подсчитать все элементы кортежа во вложенном списке - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу получить количество всех элементов во вложенном списке. nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]

Мой ожидаемый результат:

{'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1}

Мой текущий код: Counter(itertools.chain(*nested_lst)), который выдает количество кортежей вместо каждого элемента.

Ответы [ 5 ]

0 голосов
/ 06 ноября 2018

Вы всегда можете пройтись по каждому списку кортежей и добавить число с помощью Counter.update():

from collections import Counter
from itertools import chain

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]

counts = Counter()
for lst in nested_lst:
    counts.update(Counter(chain.from_iterable(lst)))

print(counts)
# Counter({'NOUN': 5, 'shoe': 2, 'shirt': 2, 'jacket': 1, 'VERB': 1, 'jump': 1, 'ADJ': 1, 'fancy': 1})
0 голосов
/ 06 ноября 2018

Если ваш список вложен только один раз, вы можете получить плоский список с помощью sum(). После этого вы можете создать пустой словарь и увеличивать значение в каждой итерации, где появляется слово. Если есть новое слово, значение по умолчанию равно нулю, и оно будет добавлено в любом случае. Скорее всего, не самое эффективное решение.

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]
flat_lst = sum(nested_lst, [])
dct = {}
for typ, name in flat_lst:
    dct[typ] = 1 + dct.setdefault(typ, 0)
    dct[name] = 1 + dct.setdefault(name, 0)

# {'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1}
print(dct)
0 голосов
/ 06 ноября 2018
In [2]: for i in nested_lst:
   ...:     for j in i:
   ...:         for k in j:
   ...:             d[k] = d.setdefault(k, 0) + 1
   ...:

In [3]: d
Out[3]:
{'ADJ': 1,
 'NOUN': 5,
 'VERB': 1,
 'fancy': 1,
 'jacket': 1,
 'jump': 1,
 'shirt': 2,
 'shoe': 2}
0 голосов
/ 06 ноября 2018

Вы очень близки. Вам просто нужна еще одна итерация значений, возвращаемых chain, чтобы получить желаемый результат:

from collections import Counter
from itertools import chain

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]

print(Counter(y for x in chain.from_iterable(nested_lst) for y in x))
# Counter({'NOUN': 5, 'shoe': 2, 'shirt': 2, 'jacket': 1, 'VERB': 1, 'jump': 1, 'ADJ': 1, 'fancy': 1})
0 голосов
/ 06 ноября 2018

Дважды применить цепь, чтобы избавиться от внутренних кортежей

from itertools import chain
from collections import Counter
Counter(chain(*chain(*nested_lst)))

или

Counter(chain.from_iterable(chain.from_iterable(nested_lst)))

Выход:

Counter({'ADJ': 1,
         'NOUN': 5,
         'VERB': 1,
         'fancy': 1,
         'jacket': 1,
         'jump': 1,
         'shirt': 2,
         'shoe': 2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...