【问题标题】:Count occurrences of each key in python dictionary计算python字典中每个键的出现次数
【发布时间】:2015-09-06 22:16:29
【问题描述】:

我有一个看起来像这样的 Python 字典对象:

[{"house": 4,  "sign": "Aquarius"},
 {"house": 2,  "sign": "Sagittarius"},
 {"house": 8,  "sign": "Gemini"},
 {"house": 3,  "sign": "Capricorn"},
 {"house": 2,  "sign": "Sagittarius"},
 {"house": 3,  "sign": "Capricorn"},
 {"house": 10, "sign": "Leo"},
 {"house": 4,  "sign": "Aquarius"},
 {"house": 10, "sign": "Leo"},
 {"house": 1,  "sign": "Scorpio"}]

现在对于每个“符号”键,我想计算每个值出现的次数。

def predominant_sign(data):
    signs = [k['sign'] for k in data if k.get('sign')]
    print len(signs)

但是,这会打印“符号”在字典中出现的次数,而不是获取 sign 的值并计算特定值出现的次数。

例如,我想看到的输出是:

Aquarius: 2
Sagittarius: 2
Gemini: 1
...

等等。我应该改变什么以获得所需的输出?

【问题讨论】:

  • 您希望结果按任何特定顺序排列?
  • @thefourtheye,不是真的。任何顺序都可以。下面的两个答案很快就奏效了。 :)
  • 另外,你有一个 Python 字典列表 :-)

标签: python python-2.7 dictionary


【解决方案1】:
def counter(my_list):
    my_list = sorted(my_list)
    first_val, *all_val = my_list
    p_index = my_list.index(first_val)
    my_counter = {}
    for item in all_val:
         c_index = my_list.index(item)
         diff = abs(c_index-p_index)
         p_index = c_index
         my_counter[first_val] = diff 
         first_val = item
    c_index = my_list.index(item)
    diff = len(my_list) - c_index
    my_counter[first_val] = diff 
    return my_counter

>>> counter([list(i.values())[1] for i in my_list])
{'Aquarius': 2,
 'Capricorn': 2,
 'Gemini': 1,
 'Leo': 2,
 'Sagittarius': 2,
 'Scorpio': 1}

【讨论】:

    【解决方案2】:

    你可以使用collections.Counter模块,用一个简单的生成器表达式,像这样

    >>> from collections import Counter
    >>> Counter(k['sign'] for k in data if k.get('sign'))
    Counter({'Sagittarius': 2, 'Capricorn': 2, 'Aquarius': 2, 'Leo': 2, 'Scorpio': 1, 'Gemini': 1}) 
    

    这将为您提供一个字典,其中 signs 作为键,它们的出现次数作为值。


    你可以对普通字典做同样的事情,像这样

    >>> result = {}
    >>> for k in data:
    ...     if 'sign' in k:
    ...         result[k['sign']] = result.get(k['sign'], 0) + 1
    >>> result
    {'Sagittarius': 2, 'Capricorn': 2, 'Aquarius': 2, 'Leo': 2, 'Scorpio': 1, 'Gemini': 1}
    

    dictionary.get 方法接受第二个参数,如果在字典中找不到键,则返回默认值。因此,如果当前符号不在result 中,它将改为0

    【讨论】:

      【解决方案3】:

      使用collections.Counter 及其most_common method

      from collections import Counter
      def predominant_sign(data):
          signs = Counter(k['sign'] for k in data if k.get('sign'))
          for sign, count in signs.most_common():
              print(sign, count)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-22
        • 2022-01-10
        • 2019-07-13
        相关资源
        最近更新 更多