您的位置:首页 > 编程语言 > Python开发

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

2014-01-20 10:14 579 查看
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


python dictionary python-2.x

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.

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: