Словарь возвращает только последние пары значений ключа внутри цикла for - PullRequest
3 голосов
/ 10 июля 2019

У меня есть список строк:

A = [
    'philadelphia court excessive disappointed court hope hope',
    'hope hope jurisdiction obscures acquittal court',
    'mention hope maryland signal held mention problem internal reform life bolster level grievance'
    ]

и другой список как:

B = ['court', 'hope', 'mention', 'life', 'bolster', 'internal', 'level']

Я хочу создать словарь на основе количества вхождений слов списка B в списке строк A. Что-то вроде

C = [
        {'count':2,'hope':2,'mention':0,'life':0,'bolster':0,'internal':0,'level':0},
        {'count':1,'hope':2,'mention':0,'life':0,'bolster':0,'internal':0,'level':0},
        {'count':0,'hope':1,'mention':2,'life':1,'bolster':1,'internal':1,'level':1}
    ]

Что мне понравилось,

dic={}
for i in A:
    t=i.split()
    for j in B:
        dic[j]=t.count(j)

Но он возвращает только последнюю пару словарей,

print (dic)

{'court': 0,
 'hope': 1,
 'mention': 2,
 'life': 1,
 'bolster': 1,
 'internal': 1,
 'level': 1}

Ответы [ 5 ]

2 голосов
/ 10 июля 2019

Вместо создания списка диктов, как в примере с вашим примером, вы создаете только один дикт (и перезаписывает счет слов каждый раз, когда вы проверяете фразу).Вы можете использовать re.findall для подсчета вхождений слов в каждой фразе (преимущество состоит в том, что вы не ошибаетесь, если любая из ваших фраз содержит слова, за которыми следует пунктуация, такая как «надежда?»).

import re

words = ['court', 'hope', 'mention', 'life', 'bolster', 'internal', 'level']
phrases = ['philadelphia court excessive disappointed court hope hope','hope hope jurisdiction obscures acquittal court','mention hope maryland signal held mention problem internal reform life bolster level grievance']

counts = [{w: len(re.findall(r'\b{}\b'.format(w), p)) for w in words} for p in phrases]

print(counts)
# [{'court': 2, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 1, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 0, 'hope': 1, 'mention': 2, 'life': 1, 'bolster': 1, 'internal': 1, 'level': 1}]
1 голос
/ 10 июля 2019

Две проблемы: Вы инициализируете dic не в том месте и не собираете эти dic в списке.Вот исправление:

C = []    
for i in A:
    dic = {}
    t=i.split()
    for j in B:
        dic[j]=t.count(j)
    C.append(dic)
# Result:
[{'court': 2, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0},
{'court': 1, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0},
{'court': 0, 'hope': 1, 'mention': 2, 'life': 1, 'bolster': 1, 'internal': 1, 'level': 1}]
0 голосов
/ 16 июля 2019

Попробуйте,

from collections import Counter

A = ['philadelphia court excessive disappointed court hope hope',
     'hope hope jurisdiction obscures acquittal court',
     'mention hope maryland signal held mention problem internal reform life bolster level grievance']

B = ['court', 'hope', 'mention', 'life', 'bolster', 'internal', 'level']

result = [{b: dict(Counter(i.split())).get(b, 0) for b in B} for i in A]
print(result)

вывод:

[{'court': 2, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 1, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 0, 'hope': 1, 'mention': 2, 'life': 1, 'bolster': 1, 'internal': 1, 'level': 1}]
0 голосов
/ 10 июля 2019

Чтобы избежать перезаписи существующих значений, проверьте, есть ли запись в словаре. Попробуйте добавить:

if j in b:
    dic[j] += t.count(j)
else:
    dic[j] = t.count(j)
0 голосов
/ 10 июля 2019

Вы всегда перезаписываете существующие значения в dict dic с помощью dict[j]=t.count(j). Вы можете создать новый dict для каждого i и добавить его в список вроде:

dic=[]
for i in A:
    i_dict = {}
    t=i.split()
    for j in B:
        i_dict[j]=t.count(j)
    dic.append(i_dict)
print(dic)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...