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

后端 未结 2 1172
猫巷女王i
猫巷女王i 2020-12-29 04:07

I know about list comprehensions, what about dictionary comprehensions?

Expected Output:

>>> countChar(\'google\')
    {\'e\': 1, \'g\': 2,          


        
相关标签:
2条回答
  • 2020-12-29 04:59

    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
    
    0 讨论(0)
  • 2020-12-29 05:07

    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.

    0 讨论(0)
提交回复
热议问题