合并版本字典数组

2024-10-01 15:41:44 发布

您现在位置:Python中文网/ 问答频道 /正文

给定以下两个字典数组,如何合并它们,使生成的字典数组只包含版本最大的字典?你知道吗

data1 = [{'id': 1, 'name': u'Oneeee', 'version': 2},
         {'id': 2, 'name': u'Two', 'version': 1},
         {'id': 3, 'name': u'Three', 'version': 2},
         {'id': 4, 'name': u'Four', 'version': 1},
         {'id': 5, 'name': u'Five', 'version': 1}]

data2 = [{'id': 1, 'name': u'One', 'version': 1},
         {'id': 2, 'name': u'Two', 'version': 1},
         {'id': 3, 'name': u'Threeee', 'version': 3},
         {'id': 6, 'name': u'Six', 'version': 2}]

合并的结果应如下所示:

data3 = [{'id': 1, 'name': u'Oneeee', 'version': 2},
         {'id': 2, 'name': u'Two', 'version': 1},
         {'id': 3, 'name': u'Threeee', 'version': 3},
         {'id': 4, 'name': u'Four', 'version': 1},
         {'id': 5, 'name': u'Five', 'version': 1},
         {'id': 6, 'name': u'Six', 'version': 2}]

Tags: name版本id字典version数组threefour
2条回答

如果您想根据字典id获得最高版本,那么可以使用^{}方法,如下所示:

sdata = sorted(data1 + data2, key=lambda x:x['id'])
res = []
for _,v in itertools.groupby(sdata, key=lambda x:x['id']):
    v = list(v)
    if len(v) > 1:    # happened that the same id was in both datas
        # append the one with higher version
        res.append(v[0] if v[0]['version'] > v[1]['version'] else v[1])
    else:             # the id was in one of the two data
        res.append(v[0])

这个解决方案不是一个一行程序,但我认为它足够简单(一旦您理解了groupby(),这并不是微不足道的)。你知道吗

这将导致res包含以下列表:

[{'id': 1, 'name': u'Oneeee', 'version': 2},
 {'id': 2, 'name': u'Two', 'version': 1},
 {'id': 3, 'name': u'Threeee', 'version': 3},
 {'id': 4, 'name': u'Four', 'version': 1},
 {'id': 5, 'name': u'Five', 'version': 1},
 {'id': 6, 'name': u'Six', 'version': 2}]

我认为可以进一步缩小解决方案,但可能很难理解。你知道吗

希望这有帮助!你知道吗

一个相当简单的过程性解决方案,其中我们构建一个由项id键控的字典,然后替换项:

indexed_data = { item['id']: item for item in data1 }
# or, pre-Python2.7:
# indexed_data = dict((item['id'], item) for item in data1)
for item in data2:
    if indexed_data.get(item['id'], {'version': float('-inf')})['version'] < item['version']:
        indexed_data[item['id']] = item
data3 = [item for (_, item) in sorted(indexed_data.items())]

同样的道理,但使用更实用的方法:

sorted_items = sorted(data1 + data2, key=lambda item: (item['id'], item['version']))
merged = { item['id']: item for item in sorted_items }
# or, pre-Python2.7:
# merged = dict((item['id'], item) for item in sorted_items )
data3 = [item for (_, item) in sorted(merged.items())]

相关问题 更多 >

    热门问题