如何合并来自两个字典序列的数据
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'}]
我有两个列表:
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'}]