简体   繁体   English

从另一个字典 python 更新列表字典

[英]Updating dictionaries of list from another dictionary python

I have two list of dictionaries: I am trying to compare test2 with test1 and update accordingly.我有两个字典列表:我正在尝试将 test2 与 test1 进行比较并相应地更新。

test1 = [{'names': ['a', 'b', 'c'],
  'country': 'USA',
  'state': 'Texas'},

 {'names': ['d', 'e', 'f'],
  'country': 'Australia',
  'state': 'Melbourne'},

 {'names': ['i', 'j', 'k'],
  'country': 'canada',
  'state': 'Toronto'},

 {'names': ['l', 'm', 'n'],
  'country': 'Austria',
  'state': 'Burgenland'}]

test2 = [{'code': 4286,
'list_of_countries': ['USA',
            'Australia',
            'Colombia',
            'Denmark',
            'Greece',
            'Iceland']},
 {'code':4287,
 'list_of_countries': ['Texas',
            'Argentina',
            'Austria',
            'Bangladesh', 'canada']}]

Expected Output:预期 Output:

test2 = [{'names':['a', 'b', 'c', 'd', 'e', 'f'],
        'country': ['USA', 'Australia'],
        'state': ['Texas', 'Melbourne'],
        'code':4286},

        {'names':['i', 'j', 'k', 'l', 'm', 'n'],
        'country': ['canada', 'Austria'],
        'state': ['Toronto','Burgenland'],
        'code':4287}]

Tried below snippet: By searching the test1 country in test2 list_of_countries:尝试以下片段:通过在 test2 list_of_countries 中搜索 test1 国家:

for i in test1:
    for j in test2:
        a = []
        if i.get('country') in j.get('list_of_countries'):
           a.append({'country':i.get('country'), 'state':i.get('state'})
           j.update(a)

You can transform test2 to a dictionary, associating each entry in list_of_countries with their proper key.您可以将test2转换为字典,将list_of_countries中的每个条目与其正确的键相关联。 Then, you can use this result for grouping:然后,您可以使用此结果进行分组:

test2 = [{'code': 4286, 'list_of_countries': ['USA', 'Australia', 'Colombia', 'Denmark', 'Greece', 'Iceland']}, {'code': 4287, 'list_of_countries': ['Texas', 'Argentina', 'Austria', 'Bangladesh', 'canada']}]
test1 = [{'names': ['a', 'b', 'c'], 'country': 'USA', 'state': 'Texas'}, {'names': ['d', 'e', 'f'], 'country': 'Australia', 'state': 'Melbourne'}, {'names': ['i', 'j', 'k'], 'country': 'canada', 'state': 'Toronto'}, {'names': ['l', 'm', 'n'], 'country': 'Austria', 'state': 'Burgenland'}]
d = {i:k['code'] for k in test2 for i in k['list_of_countries']}

Now, you can create a series of defaultdict s associated with the country code.现在,您可以创建一系列与国家代码关联的defaultdict By looping over the country/state dicts in test1 , you can keep a running update of the states and countries that are associated with each code:通过循环test1中的国家/地区字典,您可以保持与每个代码关联的州和国家/地区的运行更新:

from collections import defaultdict
new_d = dict(zip(d.values(), [defaultdict(list) for _ in d]))
for i in test1:
   for a, b in i.items():
     new_d[d[i['country']]][a].append(b)

r = [{'code':a, **b, 'names':[j for k in b['names'] for j in k]} for a, b in new_d.items()]

The final list comprehension transforms new_d to your desired format, a list of dictionaries.最终的列表理解将new_d转换为您想要的格式,即字典列表。

Output: Output:

[{'code': 4286, 'names': ['a', 'b', 'c', 'd', 'e', 'f'], 'country': ['USA', 'Australia'], 'state': ['Texas', 'Melbourne']}, {'code': 4287, 'names': ['i', 'j', 'k', 'l', 'm', 'n'], 'country': ['canada', 'Austria'], 'state': ['Toronto', 'Burgenland']}]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM