#python #string #list #for-loop #list-comprehension
Вопрос:
У меня есть текст, который я разделяю на список уникальных слов с помощью набора. Я также разделил текст на список предложений. Затем я разделяю этот список предложений на список списков (слов в каждом предложении / возможно, мне не нужно делать последнюю часть)
text = 'i was hungry. i got food. now i am not hungry i am full'
sents = ['i was hungry', 'i got food', 'now i am', 'not hungry i am full']
words = ['i', 'was', 'hungry', 'got', 'food', 'now', 'not', 'am', 'full']
split_sents = [['i', 'was', 'hungry'], ['i', 'got', 'food'], ['now', 'i', 'am', 'not','hungry','i','am','full']]
Я хочу написать цикл или понимание списка, который создаст словарь, в котором каждое слово в словах является ключом, и если слово появляется в предложении, каждое предложение записывается в виде значения списка, чтобы я мог получить некоторую статистику, такую как количество предложений, а также среднюю длину предложений для каждого предложения. word…so далеко у меня есть следующее, но это неправильно.
word_freq = {}
for sent in split_sents:
for word in words:
if word in sent:
word_freq[word] = sent
else:
word_freq[word] = sent
он возвращает словарь ключей слов и пустых значений. В идеале я хотел бы сделать это без коллекций/счетчиков, хотя любое решение прилагается. Я уверен, что этот вопрос уже задавался раньше, но я не смог найти правильного решения, поэтому не стесняйтесь связываться и закрываться, если вы связываетесь с решением.
Ответ №1:
Вот подход, использующий понимание списка и словаря
Код:
text = 'i was hungry. i got food. now i am not hungry i am full'
sents = ['i was hungry', 'i got food', 'now i am', 'not hungry i am full']
words = ['i', 'was', 'hungry', 'got', 'food', 'now', 'not', 'am', 'full']
word_freq = {w:[s for s in sents if w in s.split()] for w in words }
print(word_freq)
Выход:
{
'i': ['i was hungry', 'i got food', 'now i am', 'not hungry i am full'],
'was': ['i was hungry'], '
hungry': ['i was hungry', 'not hungry i am full'],
'got': ['i got food'],
'food': ['i got food'],
'now': ['now i am'],
'not': ['not hungry i am full'],
'am': ['now i am', 'not hungry i am full'],
'full': ['not hungry i am full']
}
Или, если вы хотите вывести предложения в виде списка слов:
word_freq = {w:[s.split() for s in sents if w in s.split()] for w in words }
Выход:
{
'i': [['i', 'was', 'hungry'], ['i', 'got', 'food'], ['now', 'i', 'am'], ['not', 'hungry', 'i', 'am', 'full']],
'was': [['i', 'was', 'hungry']],
'hungry': [['i', 'was', 'hungry'], ['not', 'hungry', 'i', 'am', 'full']],
'got': [['i', 'got', 'food']],
'food': [['i', 'got', 'food']],
'now': [['now', 'i', 'am']],
'not': [['not', 'hungry', 'i', 'am', 'full']],
'am': [['now', 'i', 'am'], ['not', 'hungry', 'i', 'am', 'full']],
'full': [['not', 'hungry', 'i', 'am', 'full']]}
Ответ №2:
word_freq = {}
for word in set(words):
word_freq[word] = list()
for sent in split_sents:
for word in words:
if word in sent:
word_freq[word].append(sent)
print(word_freq)
=================================================================
{'am': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
'food': [['i', 'got', 'food']],
'full': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
'got': [['i', 'got', 'food']],
'hungry': [['i', 'was', 'hungry'],
['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
'i': [['i', 'was', 'hungry'],
['i', 'got', 'food'],
['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
'not': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
'now': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
'was': [['i', 'was', 'hungry']]}
Комментарии:
1. спасибо @Abhi_J, это понимание списка внутри понимания словаря? и также спасибо Daniel111 за решение.