首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python字典列表中的项频

python字典列表中的项频
EN

Stack Overflow用户
提问于 2009-06-28 20:15:42
回答 4查看 3.9K关注 0票数 8

好的,我有一个字典列表:

代码语言:javascript
复制
[{'name': 'johnny', 'surname': 'smith', 'age': 53},
 {'name': 'johnny', 'surname': 'ryan', 'age': 13},
 {'name': 'jakob', 'surname': 'smith', 'age': 27},
 {'name': 'aaron', 'surname': 'specter', 'age': 22},
 {'name': 'max', 'surname': 'headroom', 'age': 108},
]

我想知道每一列中项目的“频率”。因此,对于这个,我会得到如下内容:

代码语言:javascript
复制
{'name': {'johnny': 2, 'jakob': 1, 'aaron': 1, 'max': 1}, 
'surname': {'smith': 2, 'ryan': 1, 'specter': 1, 'headroom': 1}, 
'age': {53:1, 13:1, 27: 1. 22:1, 108:1}}

有没有什么模块可以做这样的事情呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-28 20:23:10

来自标准库的collections.defaultdict来拯救:

代码语言:javascript
复制
from collections import defaultdict

LofD = [{'name': 'johnny', 'surname': 'smith', 'age': 53},
 {'name': 'johnny', 'surname': 'ryan', 'age': 13},
 {'name': 'jakob', 'surname': 'smith', 'age': 27},
 {'name': 'aaron', 'surname': 'specter', 'age': 22},
 {'name': 'max', 'surname': 'headroom', 'age': 108},
]

def counters():
  return defaultdict(int)

def freqs(LofD):
  r = defaultdict(counters)
  for d in LofD:
    for k, v in d.items():
      r[k][v] += 1
  return dict((k, dict(v)) for k, v in r.items())

print freqs(LofD)

发射

代码语言:javascript
复制
{'age': {27: 1, 108: 1, 53: 1, 22: 1, 13: 1}, 'surname': {'headroom': 1, 'smith': 2, 'specter': 1, 'ryan': 1}, 'name': {'jakob': 1, 'max': 1, 'aaron': 1, 'johnny': 2}}

根据需要(当然,键的顺序分开--这在字典中是无关紧要的)。

票数 14
EN

Stack Overflow用户

发布于 2009-06-28 20:27:00

代码语言:javascript
复制
items = [{'name': 'johnny', 'surname': 'smith', 'age': 53},  {'name': 'johnny', 'surname': 'ryan', 'age': 13},  {'name': 'jakob', 'surname': 'smith', 'age': 27},  {'name': 'aaron', 'surname': 'specter', 'age': 22},  {'name': 'max', 'surname': 'headroom', 'age': 108}]

global_dict = {}

for item in items:
    for key, value in item.items():
        if not global_dict.has_key(key):
            global_dict[key] = {}

        if not global_dict[key].has_key(value):
            global_dict[key][value] = 0

        global_dict[key][value] += 1

print global_dict

最简单的解决方案和实际测试。

票数 2
EN

Stack Overflow用户

发布于 2009-06-28 20:33:08

Python3.1中的新特性:collections.Counter类:

代码语言:javascript
复制
mydict=[{'name': 'johnny', 'surname': 'smith', 'age': 53},
 {'name': 'johnny', 'surname': 'ryan', 'age': 13},
 {'name': 'jakob', 'surname': 'smith', 'age': 27},
 {'name': 'aaron', 'surname': 'specter', 'age': 22},
 {'name': 'max', 'surname': 'headroom', 'age': 108},
]

import collections
newdict = {}

for key in mydict[0].keys():
    l = [value[key] for value in mydict]
    newdict[key] = dict(collections.Counter(l))

print(newdict)

输出:

代码语言:javascript
复制
{'age': {27: 1, 108: 1, 53: 1, 22: 1, 13: 1}, 
'surname': {'headroom': 1, 'smith': 2, 'specter': 1, 'ryan': 1}, 
'name': {'jakob': 1, 'max': 1, 'aaron': 1, 'johnny': 2}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1055646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档