Есть ли словарь в Python? (Проблема с функцией, возвращающей dict) - PullRequest
25 голосов
/ 02 сентября 2011

Я знаю о списочных значениях, а как же словарные?

Ожидаемый результат:

>>> 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

Ответы [ 2 ]

65 голосов
/ 02 сентября 2011

Если вы используете 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
32 голосов
/ 02 сентября 2011

edit : Как указано в комментариях agf и другом ответе, существует словарь для 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().

...