【问题标题】:How can I count occurrences of values in a list of dicts?如何计算字典列表中值的出现次数?
【发布时间】:2016-09-23 03:23:33
【问题描述】:

我有这个字典列表:

[{'Description': 'LARCENY'}, {'Description': 'LARCENY'}, {'Description': 'BURGLARY'}, {'Description': 'ROBBERY - STREET'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'AUTO THEFT'}, {'Description': 'AUTO THEFT'}, {'Description': 'ROBBERY - STREET'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'BURGLARY'}, {'Description': 'BURGLARY'}, {'Description': 'LARCENY'}, {'Description': 'ROBBERY - COMMERCIAL'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}]

我需要创建一个函数来遍历这些字典并计算每种类型的犯罪发生了多少次。输出应该是这样的字典列表:

[{'LARCENY' : 3}, {'BURGLARY' : 2}, {'ROBBERY - STREET' : 3}...

对于每种类型的犯罪,我需要知道该犯罪发生了多少次。 这是我目前所拥有的:

result = {}
for k in data:
   if 'Description' in k:
    result[k['Description']] = result.get(k['Description'], 0) + 1 

但是给出的输出给了我同一个字典中的所有内容,但我希望它们在一个字典列表中,每个犯罪与每个字典。

如果您不明白我的意思,请随时提出任何问题。

【问题讨论】:

  • 为什么?具有唯一键的单个字典将比多个单键字典更有用。
  • 看起来您要的是一个字典列表,每个字典中只有一个元素。这比简单的字典有什么好处?
  • 获得所需的输出后,我需要将键和值分隔到不同的列表中,使用 [li['Description'] for li in result]
  • 如果你有一个 dict d,你可以通过 [{k: d[k]} for k in d.keys()] 将键分成单独的 dicts]

标签: python list python-2.7 dictionary


【解决方案1】:

虽然您的数据结构如上所述没有意义,但您可以使用集合中的 Counter 类轻松解决此问题。

from collections import Counter

crimes = [{'Description': 'LARCENY'}, {'Description': 'LARCENY'}, {'Description': 'BURGLARY'}, {'Description': 'ROBBERY - STREET'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'AUTO THEFT'}, {'Description': 'AUTO THEFT'}, {'Description': 'ROBBERY - STREET'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'BURGLARY'}, {'Description': 'BURGLARY'}, {'Description': 'LARCENY'}, {'Description': 'ROBBERY - COMMERCIAL'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}]

c = Counter()
for item in crimes:
    c[item["Description"]] += 1

print(c)

这给出了以下输出:

Counter({'COMMON ASSAULT': 7, 'BURGLARY': 3, 'LARCENY': 3, 'AUTO THEFT': 2, 'ROBBERY - STREET': 2, 'ROBBERY - COMMERCIAL': 1})

我建议您在计算时查看 Counter 类。

【讨论】:

    【解决方案2】:

    看起来你也想保持犯罪发生的顺序。

    所以,请使用collections.OrderedDict 而不是普通的字典。

    >>> from collections import OrderedDict
    >>> counter = OrderedDict()
    >>> for item in data:
    ...     if 'Description' in item:
    ...         counter[item['Description']] = counter.get(item['Description'], 0) + 1
    

    现在,只需用 counter 中的每个键值对构造一个新字典,就像这样

    >>> from pprint import pprint
    >>> pprint([{k: v} for k, v in counter.items()])
    [{'LARCENY': 3},
     {'BURGLARY': 3},
     {'ROBBERY - STREET': 2},
     {'COMMON ASSAULT': 7},
     {'AUTO THEFT': 2},
     {'ROBBERY - COMMERCIAL': 1}]
    

    来自cmets,

    在获得所需的输出后,我需要将键和值分开到不同的列表中,

    那么,不要创建字典列表。直接从counter本身创建两个列表,分别是keysvalues,像这样

    >>> list(counter.keys())
    ['LARCENY', 'BURGLARY', 'ROBBERY - STREET', 'COMMON ASSAULT', 'AUTO THEFT', 'ROBBERY - COMMERCIAL']
    >>> list(counter.values())
    [3, 3, 2, 7, 2, 1]
    

    【讨论】:

      【解决方案3】:

      鉴于你目前得到的结果......

      >>> result = {'LARCENY' : 3, 'BURGLARY' : 2, 'ROBBERY - STREET' : 3}
      >>> result = [{k:v} for k,v in result.items()]
      >>> result
      [{'BURGLARY': 2}, {'LARCENY': 3}, {'ROBBERY - STREET': 3}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-04
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 2023-01-12
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多