Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按其中一个键的值拆分dict_Python_Python 2.7 - Fatal编程技术网

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

Python 按其中一个键的值拆分dict,python,python-2.7,Python,Python 2.7,我有一个数据长度相同(但类型不同)的字典,比如: 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将其一分为二,保留相应的info和number。也就是说,有两个dictdata1和data2 注意:这只是一个

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

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
将其一分为二,保留相应的
info
number
。也就是说,有两个dict
data1
data2

注意:这只是一个示例,dict中有多个键,我希望避免使用键名,而是循环使用所有键名

什么是Pythonic方法?

>>来自collections import defaultdict
>>> 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']})
>>> 
>>>res=defaultdict(列表) >>>对于ID,zip中的信息(数据[“ID”],数据[“信息]): res[ID]。追加(信息) >>>res defaultdict(,{1:['info1','info2','info5','info7'],2:['info3','info4','info6','info8'])) >>>
包含理解列表:

data1 = [ data["info"][idx] for idx, x in enumerate(data["id"]) if x == 1 ]
#data1 = ['info1', 'info2', 'info5', 'info7']
如果要恢复所有密钥,请执行以下操作:

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

对于处理记录,我个人喜欢
numpy.recarray

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
如果您需要原始状态的数据(id):

结果:

>>> databyid[1]
defaultdict(<type 'list'>, {'info': ['info1', 'info2', 'info5', 'info7'], 'number': [1, 2, 5, 7]})
>>> databyid[2]
defaultdict(<type 'list'>, {'info': ['info3', 'info4', 'info6', 'info8'], 'number': [3, 4, 6, 8]})
>>> 
>>databyd[1]
defaultdict(,{'info':['info1','info2','info5','info7'],'number':[1,2,5,7]})
>>>databyid[2]
defaultdict(,{'info':['info3','info4','info6','info8'],'number':[3,4,6,8]})
>>> 

这是一个需要解析的文本文件,还是一个实际的python字典?如果它是一个实际的字典,你能以字典的形式发布它吗?用示例数据编辑
date
数据中键入
dict?编辑-不管列是什么。有两个以上的列,它们的类型不同。除了有多个列(>5,所以不容易输入)之外,还有一个很好的,伙计!简短而准确地描述了我需要的:)我不知道这个,看起来很有用!谢谢
from collections import defaultdict

ids = data.pop('id')
databyid = defaultdict(lambda: defaultdict(list))

for id, values in zip(ids, zip(*data.values())):
    for kid, kval in enumerate(data.keys()):
        databyid[id][kval].append(values[kid])
 data['id'] = ids
>>> databyid[1]
defaultdict(<type 'list'>, {'info': ['info1', 'info2', 'info5', 'info7'], 'number': [1, 2, 5, 7]})
>>> databyid[2]
defaultdict(<type 'list'>, {'info': ['info3', 'info4', 'info6', 'info8'], 'number': [3, 4, 6, 8]})
>>>