Are there dictionary comprehensions in Python? (Problem with function returning dict)

不想你离开。 提交于 2019-11-29 01:51:18

问题


I know about list comprehensions, what about dictionary comprehensions?

Expected Output:

>>> countChar('google')
    {'e': 1, 'g': 2, 'l': 1, 'o': 2}
    >>> countLetters('apple')
    {'a': 1, 'e': 1, 'l': 1, 'p': 2}
    >>> countLetters('')
    {}

Code (I'm a beginner):

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 }

What is the problem with this code? Why do I get this SyntaxError?

return { item:word.count(item) for item in uniqueSet }
^
SyntaxError: invalid syntax

回答1:


edit: As agf pointed out in comments and the other answer, there is a dictionary comprehension for Python 2.7 or newer.

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}

There is no need to convert word to a list or sort it before turning it into a set since strings are iterable:

>>> set('google')
set(['e', 'o', 'g', 'l'])

There is no dictionary comprehension with for Python 2.6 and below, which could be why you are seeing the syntax error. The alternative is to create a list of key-value tuples using a comprehension or generator and passing that into the dict() built-in.




回答2:


If you're on Python 2.7 or newer:

{item: word.count(item) for item in set(word)}

works fine. You don't need to sort the list before you set it. You also don't need to turn the word into a list. Also, you're on a new enough Python to use collections.Counter(word) instead.

If you're on an older version of Python, you can't use dict comprehensions, you need to use a generator expression with the dict constructor:

dict((item, word.count(item)) for item in set(word))

This still requires you to iterate over word len(set(word)) times, so try something like:

from collections import defaultdict
def Counter(iterable):
    frequencies = defaultdict(int)
    for item in iterable:
        frequencies[item] += 1
    return frequencies


来源:https://stackoverflow.com/questions/7276511/are-there-dictionary-comprehensions-in-python-problem-with-function-returning

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!