Извлечение релевантных ключевых слов из списка кортежей

Я новичок в Python и мне нужна помощь. У меня есть несколько списков слов и частот их упоминания в таком формате:

ResponseTweetsAug27 =[('rescue', 239), ('escape', 164), ...]

ImpactTweetsAug27 = [('близко', 1350), ('падение', 1267), ...]

и так далее. Эти списки находятся в файле, где каждый список находится на отдельной строке.

Многие пары слово-частота не имеют значения. Мне нужно просмотреть списки и извлечь пары «частота слов», связанные с основным списком слов в следующем формате:

key_terms = ['beprep', 'приготовиться', 'приготовиться', 'ураганная подготовка', 'ураганная подготовка'...]

Цель состоит в том, чтобы отобразить количество упоминаний слов в основном списке. Я думаю, что это будет включать в себя повторение списков кортежей, но я новичок в этом, и мне нужно руководство. Заранее спасибо!

Редактировать: я могу перемещаться по каждому списку кортежей отдельно, но как бы вы перебирали их все, если у них разные названия?


person F0restPerson    schedule 27.06.2018    source источник


Ответы (2)


Вы можете использовать collections.defaultdict с itertools.chain для возврата словаря счетчиков. Для key_terms рекомендуется set для поиска сложности O(1).

Данные от @Frynio.

ListA = [('beprep', 239), ('gear up', 164)]
ListB = [('get ready', 1350), ('falling', 1267)]

from collections import defaultdict
from itertools import chain

key_terms = {'beprep', 'gear up', 'get ready'}

d = defaultdict(int)

for key, value in chain(ListA, ListB):
    if key in key_terms:
        d[key] += value

print(d)

defaultdict(int, {'beprep': 239, 'gear up': 164, 'get ready': 1350})
person jpp    schedule 27.06.2018
comment
Что ж, лучше было бы не создавать два списка. Лучшим решением здесь было бы создание списка списков и итерация по нему следующим образом: for key, value in chain(*lists). Это более общее - person minecraftplayer1234; 27.06.2018
comment
@Frynio, конечно, но в таком случае надо использовать chain.from_iterable вместо распаковки через chain(*...). - person jpp; 27.06.2018
comment
Есть ли разница в производительности или безопасности? Просто спрашиваю, потому что в документах ничего не нашел. - person minecraftplayer1234; 27.06.2018
comment
@Frynio, больше производительности (проверьте сами), распаковка требует немного больше работы. - person jpp; 27.06.2018

Допустим, вы уже прочитали списки из файлов и поместили их в переменную lists:

ResponseTweetsAug27 = [('beprep', 239), ('gear up', 164)]

ImpactTweetsAug27 = [('get ready', 1350), ('falling', 1267)]

lists = [ResponseTweetsAug27, ImpactTweetsAug27]

key_terms = ['beprep', 'gear up', 'get ready']

for l in lists:
    for pair in l:
        if pair[0] in key_terms:
            print(pair[0], pair[1])

Вы можете перебирать lists. Каждый элемент представляет собой список. Затем в каждом списке (здесь он называется l) вы перебираете каждую пару, проверяя, существует ли имя/название, как бы вы его ни назвали, в key_terms. Если это так, вы распечатываете это и количество раз, когда они упоминаются. Результат:

> python tuples.py
beprep 239
gear up 164
get ready 1350
person minecraftplayer1234    schedule 27.06.2018