Python中是否有字典推导式?(函数返回字典问题)

25

我知道列表推导式,那么字典推导式呢?

预期输出:

>>> 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
语法错误是多余的 )word.count(item)) - Ben James
1
已经进行了修正,但仍然存在问题。 - newbie
你能复制粘贴一下你实际收到的错误吗? - SingleNegationElimination
1
from collections import Counter as countChar - Jochen Ritzel
2个回答

67

如果您使用的是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))

这仍然需要你迭代wordlen(set(word))次,所以尝试使用以下方法:

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

7
Python的语法总让我感觉像是在作弊。为什么其他语言就不能这么简单呢? - ArtOfWarfare

33

编辑:正如 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()函数。


你的代码太短了,它可以工作,但我是一个初学者,你有其他适合初学者的方法吗? - newbie
1
@新手 - 我将其从“lambda”更改为普通函数定义,我会添加一些额外的解释。 - Andrew Clark
4
Python 2.7及更新版本支持字典推导式。 - agf
@AndrewClark,你的代码并没有展示字典推导式,而是展示了在使用Python 2.7之前版本的解决方法(这对于我们运行Jython 2.5.3的人非常有用)。 - Jason S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接