如何合并来自两个字典序列的数据

How to combine data from two sequences of dictionaries

我有两个列表:

list1 = [{'tag':'XXX', 'key1':'a'}, {'tag':'YYY', 'key1':'a'}]

list2 = [{'tag':'XXX', 'key1':'c'}, {'tag':'ZZZ', 'key1':'d'}]

我需要建立一个新列表:

 comblist = [{'tag':'XXX', 'key1':'a'}, {'tag':'YYY', 'key1':'a'}, {'tag':'ZZZ', 'key1':'d'}]

我需要将列表 2 中的元素添加到列表 1,但只有那些键 'tag' 的值不存在于列表 1 中键 'tag' 的值中的元素。

你可以使用字典的更新方法更简单:

dict1 = dict((x['tag'], x['key1']) for x in list1)
dict2 = dict((x['tag'], x['key1']) for x in list2)

result = dict2.copy()
result.update(dict1)

result = [{'tag': key, 'key1': value} for key, value in result.iteritems()]

所以我构建了函数:

def add(seq1, seq2, key=None):
seen = set()
#add values from seq1 for selected key (or keys) to seen.
for item in seq1:
    seen.add(key(item))
# Check if value(s) for selected key(s) is in seen.   
for item in seq2:
    # if statemant added for support two types of sequences lists end dicts
    val = item if key is None else key(item)
    if val not in seen:
        # Add selected element from seq2 to seq1 and value of key to seen
        seq1.append(item)
        seen.add(val)
return seq1

并称它为:

comblist = list(add(list1, list2, key=lambda d: d['tag']))

效果不错。 函数适用于不同种类的数据结构和属性。 我不是专业人士,我很好奇。有没有更简单或更快的方法? 我的列表包含 1500 多个词典,每个词典有 15 个键值对。

您可以先从 list1 创建一组标签值,然后使用推导式通过列表 2 中具有新标签的字典扩展 list1:

>>> list1 = [{'tag':'XXX', 'key1':'a'}, {'tag':'YYY', 'key1':'a'}]
>>> list2 = [{'tag':'XXX', 'key1':'c'}, {'tag':'ZZZ', 'key1':'d'}]
>>> tags = set(d['tag'] for d in list1)
>>> list1.extend(d for d in list2 if not d['tag'] in tags)
>>> list1
[{'key1': 'a', 'tag': 'XXX'}, {'key1': 'a', 'tag': 'YYY'}, {'key1': 'd', 'tag': 'ZZZ'}]