带有统一密钥的字典列表

时间:2017-08-08 17:19:48

标签: python

使用Python 2.7,我有一个任意长的元组列表(t),其中:

  t[0] --> first_name_id
  t[1] --> first_name
  t[2] --> last_name_id
  t[3] --> last_name

first_name_id和first_name在集合中应该是唯一的,但last_name_id和last_name仅在first_name_id / first_name中是唯一的。

正如你在下面看到的那样,有一个简的姓氏是#34;史密斯"但是id为3而对于" Tom" "史密斯"的ID是" 0"

t =  [('1', 'Tom', '0', 'Smith'),
    ('1', 'Tom', '1', 'Johnson'),
    ('1', 'Tom', '2', 'Williams'),
    ('32', 'Jane', '0', 'Brown'),
    ('32', 'Jane', '1', 'David'),
    ('32', 'Jane', '3', 'Smith'),
    .
    .
    .
    ]

我正在考虑将其合并到字典中,以便通过传递first_name和last_name快速找到ID元组:

所以我的数据结构是:

data_structure = {
    "Tom": {"first_name_id": "1", "surnames": {"Smith": "0", "Johnson": "1", "Williams": "3"}},
    "Jane": {"first_name_id": "32", "surnames": {"Brown": "0", "David": "1", "Smith": "3"}}
    }

output = data_structure["Tom"]["first_name_id"],data_structure["Tom"]["surnames"]["Williams"]

print output 

>>> ('1', '3')

2 个答案:

答案 0 :(得分:0)

你在想这样的事吗?

output = {}
for first_name_id, first_name, last_name_id, last_name in t:
    if not first_name in output:
        output[first_name] = {'first_name_id':first_name_id,'surnames':{}}
    output[first_name]['surnames'][last_name] = 

答案 1 :(得分:0)

由于您的数据已经在firstnames和firstname id上排序,因此您可以直接对数据应用itertools.groupby以对firstnames和firstname id进行分组,然后根据其余的组数据构建inners dicts:

from collections import defaultdict 
from itertools import groupby

d = defaultdict(dict)

for (f_id, f), g in groupby(t, lambda x: (x[0], x[1])):
   d[f]['first_name_id'] = f_id
   d[f]['surnames'] = dict((k, v) for _, _, v, k in g)
defaultdict(<class 'dict'>,
            {'Jane': {'first_name_id': '32',
                      'surnames': {'Brown': '0', 
                                    'David': '1', 
                                    'Smith': '3'}},
             'Tom': {'first_name_id': '1',
                     'surnames': {'Johnson': '1',
                                  'Smith': '0',
                                  'Williams': '2'}}})