Существуют ли в Python словарные возможности? (Проблема с функцией return dict)
Я знаю о пониманиях списков, как насчет понимания словаря?
Ожидаемый результат:
>>> countChar('google')
{'e': 1, 'g': 2, 'l': 1, 'o': 2}
>>> countLetters('apple')
{'a': 1, 'e': 1, 'l': 1, 'p': 2}
>>> countLetters('')
{}
Код (я новичок):
def countChar(word):
l = []
#get a list from word
for c in word: l.append(c)
sortedList = sorted(l)
uniqueSet = set(sortedList)
return {item:word.count(item) for item in uniqueSet }
В чем проблема с этим кодом? Почему я получаю это SyntaxError
?
return { item:word.count(item) for item in uniqueSet }
^
SyntaxError: invalid syntax
Ответы
Ответ 1
edit. Как указано в комментариях и другом ответе, есть понимание словаря для Python 2.7 или новее.
def countChar(word):
return dict((item, word.count(item)) for item in set(word))
>>> countChar('google')
{'e': 1, 'g': 2, 'o': 2, 'l': 1}
>>> countChar('apple')
{'a': 1, 'p': 2, 'e': 1, 'l': 1}
Нет необходимости преобразовывать word
в список или сортировать его, прежде чем превращать его в набор, поскольку строки являются итерабельными:
>>> set('google')
set(['e', 'o', 'g', 'l'])
В Python 2.6 и ниже отсутствует понимание словаря, поэтому вы можете увидеть синтаксическую ошибку. Альтернативой является создание списка кортежей с ключом с использованием понимания или генератора и передача его в dict()
встроенный.
Ответ 2
Если вы используете Python 2.7 или новее:
{item: word.count(item) for item in set(word)}
работает отлично. Вам не нужно сортировать список до его установки. Вам также не нужно включать слово в список. Кроме того, вы используете новый достаточно Python для использования collections.Counter(word)
вместо этого.
Если вы используете более старую версию Python, вы не можете использовать dict
-понимание, вам нужно использовать генераторное выражение с конструктором dict
:
dict((item, word.count(item)) for item in set(word))
Это по-прежнему требует повторения итерации по word
len(set(word))
раз, поэтому попробуйте что-то вроде:
from collections import defaultdict
def Counter(iterable):
frequencies = defaultdict(int)
for item in iterable:
frequencies[item] += 1
return frequencies