首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按其中一个键的值拆分dict

按其中一个键的值拆分dict
EN

Stack Overflow用户
提问于 2013-04-19 15:32:16
回答 4查看 7.8K关注 0票数 3

我有一个数据长度相同(但类型不同)的字典,如下所示:

代码语言:javascript
复制
data = {
    "id": [1,1,2,2,1,2,1,2], 
    "info": ["info1","info2","info3","info4","info5","info6","info7","info8"],       
    "number": [1,2,3,4,5,6,7,8]
}

现在我想用id把它一分为二,保留各自的infonumber。也就是说,有两个字典data1data2

注意:这只是一个示例,字典中有多个键,我希望避免使用键名称,而是循环遍历所有键。

Pythonic式的方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-19 15:42:24

使用理解列表:

代码语言:javascript
复制
data1 = [ data["info"][idx] for idx, x in enumerate(data["id"]) if x == 1 ]
#data1 = ['info1', 'info2', 'info5', 'info7']

如果您想恢复所有密钥:

代码语言:javascript
复制
data1 = [ { key : data[key][idx] for key in data.keys() }  for idx, x in enu
merate(data["id"]) if x == 1 ]
>>> data1
[{'info': 'info1', 'id': 1, 'number': 1}, {'info': 'info2', 'id': 1, 'number': 2
}, {'info': 'info5', 'id': 1, 'number': 5}, {'info': 'info7', 'id': 1, 'number':
 7}]
票数 2
EN

Stack Overflow用户

发布于 2013-04-19 16:04:31

在处理记录方面,我个人喜欢numpy.recarray

代码语言:javascript
复制
In [3]: import numpy as np
In [4]: fields = data.keys()
In [8]: recs = zip(*[ lst for k, lst in data.iteritems() ])

In [9]: recs[0]
Out[9]: ('info1', 1, 1)
In [10]: recs[1]
Out[10]: ('info2', 1, 2)

In [21]: ra = np.rec.fromrecords(recs, names = fields )
In [17]: ra
rec.array([('info1', 1, 1), ('info2', 1, 2), ('info3', 2, 3), ('info4', 2, 4),
       ('info5', 1, 5), ('info6', 2, 6), ('info7', 1, 7), ('info8', 2, 8)], 
      dtype=[('info', 'S5'), ('id', '<i8'), ('number', '<i8')])

In [23]: ra[ra.id == 2]
rec.array([('info3', 2, 3), ('info4', 2, 4), ('info6', 2, 6), ('info8', 2, 8)], 
      dtype=[('info', 'S5'), ('id', '<i8'), ('number', '<i8')])

In [24]: ra[ra.id == 2].number
Out[24]: array([3, 4, 6, 8])

In [25]: ra[ra.id == 2][0]
Out[25]: ('info3', 2, 3)

In [26]: ra[ra.id == 2][0].number
Out[26]: 3

如果您希望在dict中按id对记录进行分组,请执行以下操作:

代码语言:javascript
复制
{ id: ra[ra.id == id] for id in set(ra.id) }
票数 1
EN

Stack Overflow用户

发布于 2013-04-19 15:38:52

代码语言:javascript
复制
>>> from collections import defaultdict
>>> res = defaultdict(list)
>>> for ID,info in zip(data["id"],data["info"]):
    res[ID].append(info)


>>> res
defaultdict(<type 'list'>, {1: ['info1', 'info2', 'info5', 'info7'], 2: ['info3', 'info4', 'info6', 'info8']})
>>> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16099557

复制
相关文章

相似问题

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