3

次のような、同じ長さのデータを含む辞書があります (ただし、型は異なります)。

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とを保持して、で 2 つに分割したいと思いnumberます。つまり、2 つの dictdata1data2.

注: これは単なるサンプルです。辞書には複数のキーがあり、キー名の使用は避けたいと思いますが、それらすべてをループします。

それを行うPythonicの方法は何ですか?

4

4 に答える 4

1

レコードを扱うのは個人的に好き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

dict で id によってレコードをグループ化したい場合は、次のようにします。

{ id: ra[ra.id == id] for id in set(ra.id) }
于 2013-04-19T08:04:31.393 に答える
0
>>> 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']})
>>> 
于 2013-04-19T07:38:51.800 に答える
0
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])

元の状態のデータが必要な場合 (ID 付き):

 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]})
>>> 
于 2013-04-19T09:20:17.637 に答える