Python结合具有相同特征的列表的字典

Posted

技术标签:

【中文标题】Python结合具有相同特征的列表的字典【英文标题】:Python Combining Dictionary of A List having Same Characteristics 【发布时间】:2018-07-01 00:30:19 【问题描述】:

我有一个这样的列表

values = ['id':1, 'x':2, 'id':1, 'y':4, 'id':1, 'z':6, 'id':2, 'j':5, 'id':2, 'k':10, 'id':3, 'w':1, 'id':3, 'x':3, 'id':3, 'y':5, 'id':3, 'z':7]

我希望结果是一个具有新 Dict 值的列表(如果可能,以最有效的方式),如下所示:

values = ['id':1, 'x':2, 'y':4, 'z':6, 'id':2, 'j':5, 'k':10, 'id':3, 'w':1, 'x':3, 'y':5, 'z':7]

这种情况应该如何循环。

【问题讨论】:

您想将数据分类到具有匹配 id 的子字典中吗? 【参考方案1】:

这是我的方法:

values = ['id':1, 'x':2, 'id':1, 'y':4, 'id':1, 'z':6, 'id':2, 'j':5,
 'id':2, 'k':10, 'id':3, 'w':1, 'id':3, 'x':3, 'id':3, 'y':5, 'id':3, 'z':7]

dict_1=

for i in values:
    if i['id'] not in dict_1:

        dict_1[i['id']]=[k:l for k,l in i.items()]
    else:
        dict_1[i['id']].append(k:l for k,l in i.items() if k!='id')
print(dict_1)

输出:

1: ['id': 1, 'x': 2, 'y': 4, 'z': 6], 2: ['j': 5, 'id': 2, 'k': 10], 3: ['w': 1, 'id': 3, 'x': 3, 'y': 5, 'z': 7]

【讨论】:

【参考方案2】:

使用PEP 448 中提出的新语法,从 Python 3.5 开始提供

from itertools import groupby
from operator import itemgetter

groups = groupby(values, itemgetter('id'))
new_list = []
for k,g in groups:
    z = 
    for x in g:
        z = **z,**x
    new_list.append(z)
print(new_list)

【讨论】:

【参考方案3】:

不是漂亮的解决方案,但可以工作

values = ['id': 1, 'x': 2, 'id': 1, 'y': 4, 'id': 1, 'z': 6,
          'id': 2, 'j': 5,
          'id': 2, 'k': 10, 'id': 3, 'w': 1, 'id': 3, 'x': 3,
          'id': 3, 'y': 5, 'id': 3, 'z': 7]

# get all unique possible keys
unique_keys = set((x['id'] for x in values))
result = []
for value in unique_keys:
    new_dict = dict(id=value)
    for old_dict in values:
        if old_dict['id'] == value:
            new_dict.update(old_dict)
    result.append(new_dict)
print(result)

打印结果:

'id': 1, 'z': 6, 'x': 2, 'y': 4, 'j': 5, 'id': 2, 'k': 10, 'x': 3, 'y': 5, 'id': 3, 'w': 1, 'z': 7]

【讨论】:

这个很简单很漂亮的兄弟。【参考方案4】:

粗略的解决方案:

>>> from itertools import groupby
>>> values = ['id':1, 'x':2, 'id':1, 'y':4, 'id':1, 'z':6, 'id':2, 'j':5,
 'id':2, 'k':10, 'id':3, 'w':1, 'id':3, 'x':3, 'id':3, 'y':5, 'id':3, 'z':7]
>>> new_values = []
>>> for g,x in groupby(sorted(','.join('|'.format(k,v) for k,v in sorted(d.items())) for d in values),lambda x: x[:x.index(',',3)]):
        nd = dict([g.split('|')])
        nd.update(z[len(g)+1:].split('|') for z in x)
        new_values.append(nd)

>>> new_values
['y': '4', 'x': '2', 'z': '6', 'id': '1', 'k': '10', 'j': '5', 'id': '2', 'y': '5', 'x': '3', 'z': '7', 'id': '3', 'w': '1']

【讨论】:

接受的答案要好得多。这只是一种奇特的方式。【参考方案5】:

collections.defaultdict 的解决方案:

from collections import defaultdict

values = ['id':1, 'x':2, 'id':1, 'y':4, 'id':1, 'z':6, 'id':2, 'j':5,
          'id':2, 'k':10, 'id':3, 'w':1, 'id':3, 'x':3, 'id':3, 'y':5, 'id':3, 'z':7]

d = defaultdict(list)
for val in values:
    d[val['id']].append(val)

result = []
for key in d:
    temp = 
    for x in d[key]:
        temp.update(x)

    result.append(temp)

print(result)

哪些输出:

['id': 1, 'x': 2, 'y': 4, 'z': 6, 'id': 2, 'j': 5, 'k': 10, 'id': 3, 'w': 1, 'x': 3, 'y': 5, 'z': 7]

【讨论】:

以上是关于Python结合具有相同特征的列表的字典的主要内容,如果未能解决你的问题,请参考以下文章

Python:总结具有不同键和相同值的字典列表

在python中,列表,字典的相互转换?

python数据结构之列表字典元组集合

将具有相同索引的熊猫系列列表转换为字典

在 Python 中删除列表中的重复字典

在python中合并字典值列表