Python: вложенный словарь - создайте, если ключ не существует, иначе сумма 1 - PullRequest
1 голос
/ 30 октября 2019

ESCENARIO
Я пытаюсь подсчитать, сколько раз слово появляется в предложении, для списка предложений. Каждое предложение представляет собой список слов.
Я хочу, чтобы в окончательном словаре был ключ для каждого слова во всем корпусе и второй ключ, указывающий предложения, в которых они появляются, со значением, равным количеству его появления. в этом.

ТЕКУЩЕЕ РЕШЕНИЕ
Следующий код работает правильно:

dfm = dict()
for i,sentence in enumerate(setences):
    for word in sentence:
        if word not in df.keys():
            dfm[word] = dict()
        if i not in dfm[word].keys():
            dfm[word][i] = 1
        else:
            dfm[word][i] += 1

ВОПРОС
Есть ли более чистый способ сделать этос питоном?
Я уже прошел это и это , где они предлагают использовать:

dic.setdefault(key,[]).append(value)  

и,

d = defaultdict(lambda: defaultdict(dict))

Я думаю, что это хорошее решение, но я не могу понять, как адаптировать это к моему конкретному решению.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 30 октября 2019

Скажем, у вас есть этот ввод:

sentences = [['dog','is','big'],['cat', 'is', 'big'], ['cat', 'is', 'dark']]

Ваше решение:

dfm = dict()
for i,sentence in enumerate(sentences):
    for word in sentence:
        if word not in dfm.keys():
            dfm[word] = dict()
        if i not in dfm[word].keys():
            dfm[word][i] = 1
        else:
            dfm[word][i] += 1

Defaultdict int:

from collections import defaultdict

dfm2 = defaultdict(lambda: defaultdict(int))

for i,sentence in enumerate(sentences):
    for word in sentence:
        dfm2[word][i] += 1 

Тест:

dfm2 == dfm  # True


#{'dog': {0: 1},
# 'is': {0: 1, 1: 1, 2: 1},
# 'big': {0: 1, 1: 1},
# 'cat': {1: 1, 2: 1},
# 'dark': {2: 1}}
1 голос
/ 30 октября 2019

для более чистой версии используйте Counter

from collections import Counter

string = 'this is america this is america'
x=Counter(string.split())
print(x)

вывод

Counter({'this': 2, 'is': 2, 'america': 2})

если хотите получить собственный код, то

копирование входных данных (предложения) из @rassar

def func(list_:list):      
    dic = {}
    for sub_list in list_:
        for word in sub_list:
            if word not in dic.keys():
                dic.update({word:1})
            else:
                dic[word]+=1
    return dic


sentences = [['dog','is','big'],['cat', 'is', 'big'], ['cat', 'is', 'dark']]


print(func(sentences))

выход

{'dog': 1, 'is': 3, 'big': 2, 'cat': 2, 'dark': 1}
0 голосов
/ 30 октября 2019

Использовать счетчики

from collections import Counter

sentences = ["This is Day", "Never say die", "Chat is a good bot", "Hello World", "Two plus two equals four","A quick brown fox jumps over the lazy dog", "Young chef, bring whisky with fifteen hydrogen ice cubes"]

sentenceWords = ( Counter(x.lower() for x in sentence.split()) for sentence in sentences)

#print result
print("\n".join(str(c) for c in sentenceWords))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...