2016-03-26 4 views
1

Как инициализировать словарь python с ключами, которые не определены заранее?Инициализация словаря python с новыми ключами

Если я просто инициализирую словарь с помощью dict = {}, он дает мне ошибку ключа, когда я пытаюсь заполнить его новыми парами ключ-значение.

Обходным путем было бы сделать попытку, кроме того, чтобы она пыталась получить доступ к существующим ключам сначала или инициализировала словарь для нового ключа, если первая не удалась. Конкретным примером может быть подсчет слов в тексте (этот пример кода приведет к Key Error):

wordcount = {} 
for word in text: 
    wordcount[word] += 1 
+0

Вы можете использовать либо defaultdict (INT), чтобы создать свой словарь или использовать WordCount [слово] = wordcount.get (слово, 0) + 1. –

+0

начать с того, ' wordcount [слово] + = 1' делает без стенограммы – woozyking

+0

Если вы не хотите, чтобы другой пользователь ответил на ваш вопрос, помогите им понять вашу проблему. Ваш вопрос рассматривает использование языка python, поэтому, пожалуйста, пройдите мимо вашего кода на Python. Легче сказать, что не так, просто глядя на код, пытаясь понять, что было целью автора. – IOR88

ответ

0

Вы должны убедиться, инициализировать ключи, прежде чем пытаться увеличивать их (+=1). Попробуйте следующее:

wordcount = {} 
text = ["word","foo","word","word","bar","bar","word","something"] 
for word in text: 
    if word in wordcount: # tests to see if the key exists already 
     wordcount[word] += 1 
    else: # initializes the key to 1 
     wordcount[word] = 1 
print(wordcount) 
# prints {'bar': 2, 'word': 4, 'something': 1, 'foo': 1} 
0

Вам нужно сначала добавить пару ключ-значение в ваш dict.

wordcount = {} 
for word in text: 
    if word not in wordcount: 
     wordcount[word] = 0 
    wordcount[word] += 1 
+0

В строке 4 вы должны установить 'wordcount [word]' to '0' вместо' 1'. – AMACB

+0

@AMACB вы правы или 'продолжаете' :) –

2

С подходом, что вы делаете, как вы должны делать это проверка, чтобы увидеть, если ключ уже существует, используя ключевое слово in. Если он затем сделать свой прирост, в противном случае просто назначить 1. как это:

wordcount = {} 
text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 
for word in text: 
    if word in wordcount:  
     wordcount[word] += 1 
    else: 
     wordcount[word] = 1 

print(wordcount) 

# {'yes': 1, 'stuff': 1, 'sentence': 1, 'my': 2, 'is': 2, 'this': 1, 'it': 1} 

За ваши комментарии, вы можете избежать этого условия, если вы на самом деле использовать defaultdict из модуля collections (documentation). Вы просто устанавливаете значение default для своих словарных статей и продолжаете работу с вашим +=. Пример:

from collections import defaultdict 
my_dict = defaultdict(int) 
text_list = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 

for text in text_list: 
    my_dict[text] += 1 

print(my_dict) 

# defaultdict(<class 'int'>, {'sentence': 1, 'this': 1, 'is': 2, 'my': 2, 'yes': 1, 'it': 1, 'stuff': 1}) 

Теперь, если вы просто пытаетесь считать слова в тексте, то есть что-то встроенный, чтобы сделать это уже для вас называется Counter из модуля collections (documentation). Это будет содержать количество всех подобных элементов. Обратите внимание на пример:

from collections import Counter 
text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"]  
my_count_dict = Counter(text) 

print(my_count_dict) 

Counter({'my': 2, 'is': 2, 'stuff': 1, 'this': 1, 'it': 1, 'sentence': 1, 'yes': 1}) 

Обращайте внимание на выходные данные как на порядок чаще всего. Если вам нужно, чтобы получить наиболее общее слово, называют most_common на нем:

print(my_count_dict.most_common(1)) 
# [('my', 2)] 
+0

@Alpha проверить обновление. Я добавил пример defaultdict – idjaw

+0

Одна проблема с использованием счетчика (который работает btw, thanks!) Заключается в том, что я хотел бы сортировать в конце, и кажется, что словари более подходят для сортировки ... – Alpha

+0

Словари не упорядочены. Однако, если вы просмотрите документацию и наблюдаете из моего вывода, сборники Counter, что он «упорядочен» по наиболее частым буквам. Кроме того, если вам нужно наиболее частое письмо, вы вызываете '.most_common (1)'. Я приведу пример – idjaw

2

Нет необходимости инициализировать Dict с заранее заданными значениями.

Вы также не нужны никакие Try/за исключением, но только с помощью языка Python defaultdict с типом по умолчанию установлен в int:

from collections import defaultdict 
wordcount = defaultdict(int) 
for word in text: 
    wordcount[word] += 1 

Однако, если вам просто нужно считать слова в списке, Python также имел вспомогательный класс под названием Counter, также в коллекциях.

0

Если я понял, ваша цель здесь, которая должна получить dict от слова: рассчитывать отображение, то вы можете сделать это также с пониманием словаря (принимая пример idjaw):

>>> text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 
>>> 
>>> {c:text.count(c) for c in text} 
{'it': 1, 'my': 2, 'yes': 1, 'is': 2, 'stuff': 1, 'this': 1, 'sentence': 1} 

Или же Counter от collections модуля также не будет делать работу:

>>> from collections import Counter 
>>> 
>>> c = Counter() 
>>> 
>>> for word in text: 
     c[word] += 1 


>>> c 
Counter({'my': 2, 'is': 2, 'it': 1, 'yes': 1, 'stuff': 1, 'this': 1, 'sentence': 1}) 
>>> 
+0

В этом случае размещение такого количества в таком понимании сделает его «O (n^2)» – idjaw

+0

@idjaw ... правильно ... Вот почему я включил также решение «Counter» ... Спасибо за голову –