2015-03-26 2 views
1
word = 'stacks' 
word_dict = {} # to form new dictionary formed from 
for letter in word: 
    word_dict[letter] += 1 
print word_dict 

Я хочу создать новый словарь из строки, отслеживая количество букв от word. Так что я пытаюсь получить:Как создать словарь из строки?

> word_dict = {'s':2, 't':1, 'a':1, 'c':1, 'k':1} 

Но я не могу понять, как это сделать. Я получаю KeyError с моим текущим кодом

+1

возможный дубликат [подсчета частоты каждой буквы в строке] (http://stackoverflow.com/questions/10806866/counting-each- letters-frequency-in-a-string) – myaut

ответ

8

Используйте collections.Counter() class вместо:

from collections import Counter 

word_dict = Counter(word) 

Counter делает одно и то же; количество экземпляров каждой буквы в word.

В вашем конкретном случае вы не впервые проверяли, существует ли ключ уже существующий или предоставляют значение по умолчанию, если оно отсутствует. Вы можете использовать dict.get(), чтобы сделать это:

word = 'stacks' 
word_dict = {} # to form new dictionary formed from 
for letter in word: 
    word_dict[letter] = word_dict.get(letter, 0) + 1 
print word_dict 

или использовать dict.setdefault() отдельно явно установить по умолчанию перед приращением:

word = 'stacks' 
word_dict = {} # to form new dictionary formed from 
for letter in word: 
    word_dict.setdefault(letter, 0) 
    word_dict[letter] += 1 
print word_dict 

или тест для ключа самостоятельно:

word = 'stacks' 
word_dict = {} # to form new dictionary formed from 
for letter in word: 
    if letter not in word_dict: 
     word_dict[letter] = 0 
    word_dict[letter] += 1 
print word_dict 

в уменьшении порядок эффективности.

Или вы могли бы использовать collections.defaultdict() object автоматически вставить 0 если ключ еще не существует:

from collections import defaultdict 

word_dict = defaultdict(int) 
for letter in word: 
    word_dict[letter] += 1 
print word_dict 

Это, по существу, что делает Counter класс, но тип добавляет некоторые другие тонкости, такие как перечисление наиболее распространенных ключей или объединение счетчиков.

Демо:

>>> from collections import defaultdict, Counter 
>>> word = 'stacks' 
>>> word_dict = {} # to form new dictionary formed from 
>>> for letter in word: 
...  word_dict[letter] = word_dict.get(letter, 0) + 1 
... 
>>> word_dict 
{'a': 1, 'c': 1, 's': 2, 't': 1, 'k': 1} 
>>> word_dict = defaultdict(int) 
>>> for letter in word: 
...  word_dict[letter] += 1 
... 
>>> word_dict 
defaultdict(<type 'int'>, {'a': 1, 'c': 1, 's': 2, 't': 1, 'k': 1}) 
>>> Counter(word) 
Counter({'s': 2, 'a': 1, 'c': 1, 't': 1, 'k': 1}) 
+0

можно ли это сделать в цикле for? Я только начал изучать Python – AlanH

+1

@AlanH: Я рассмотрел все базы здесь для вас. –

+1

Большое спасибо. Это было действительно полезно. – AlanH

1

Попробуйте

from collections import Counter 
>>>Counter(word) 
Counter({'s': 2, 'a': 1, 'c': 1, 't': 1, 'k': 1}) 
+0

Это должно быть 'from collections import Counter' – matino

+0

путать с нашими великолепными' пакетами' :) – itzMEonTV

Смежные вопросы