Python 如何计算DICT列表中出现的值?

Python 如何计算DICT列表中出现的值?,python,list,python-2.7,dictionary,Python,List,Python 2.7,Dictionary,我有一份目录: [{'Description': 'LARCENY'}, {'Description': 'LARCENY'}, {'Description': 'BURGLARY'}, {'Description': 'ROBBERY - STREET'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'COMMON ASSAULT'}, {'Description': 'AUTO THEFT'}, {'Description': 'A

我有一份目录:

[{'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 
但是给出的输出给了我在同一个目录中的所有内容,但我希望它们在一个目录列表中,每个目录中的每个罪行


如果你不理解我的问题,请随时提问。

考虑到目前为止的结果

>>> 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}]

虽然您的数据结构没有意义,但您可以使用集合中的计数器类轻松解决这一问题

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类。

看起来您也希望维护犯罪发生的顺序

所以,用口述代替普通口述

>>> from collections import OrderedDict
>>> counter = OrderedDict()
>>> for item in data:
...     if 'Description' in item:
...         counter[item['Description']] = counter.get(item['Description'], 0) + 1
现在,用
计数器中的每个键、值对构建一个新字典,如下所示

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

从评论来看


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

然后,不要创建字典列表。直接从
计数器本身创建两个列表,使用
键和
值,如下所示

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

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