首页 > 解决方案 > 遍历字典列表并与其他字典进行比较

问题描述

我有以下字典

dic1 = { 'T1': "HI , china" , 'T2': "HI , finland" ,'T3': "HI , germany"}

dic2 = { 'T1': ['INC1','INC2','INC3'] , 'T2': ['INC2','INC4','INC5'],'T3': ['INC2','INC5']}

dic3 = { 'INC1': {'location':'china'} , 'INC2': {'location':'germany'},'INC3': {'location':'germany'},'INC4': {'location':'finland'}} 

我需要根据 dic1,dic3 删除 dic2 中的值

例子 :

  1. 我必须先遍历 dic2 并检查 T1 及其 INC 值。
  2. 如果 Dic1 中对应的 T1 键值与 dic3 中对应的 INC 值匹配,则保留 dic2 中的值,否则弹出该值。

图片中给出了详细的解释。我期待以下输出。

dic2 = { 'T1': ['INC1'] , 'T2': ['INC4'],'T3': ['INC2']}

在此处输入图像描述

示例代码:

for k, v in dic2.items():
for k1, v1 in dic1.items():
    if k is k1:
        print k
        for k2 in v:
            for k3 in dic3.items():
  

我是 python 新手。我已经尝试了上面的代码片段,但我被击倒了。你能帮帮我吗?

标签: pythonpython-3.xlistdictionary

解决方案


可以在单行中完成:

>>> {k: [i for i in v if dic3.get(i, {}).get('location', '#') in dic1[k]] for k, v in dic2.items()}
{'T1': ['INC1'], 'T2': ['INC4'], 'T3': ['INC2']}

[i for i in v if dic3.get(i, {}).get('location', '#')是列表推导,仅从 的列表中选择值dic2if dic3[i]['location']is inside dic1[k],其中idict 中的键是 dictd3和dictk中的键。d2d1

我使用dic3.get(i, {}).get('location', '#')(而不是dic3[i]['location'],你得到KeyError的键INC5不在dic3)来避免键i不在的问题(将为我的下一个dic3返回一个空),然后我再次使用它来返回键的对应值,如果它存在并检查返回的字符串是否位于 dict 的值内。dict.get.getlocationd1

#如果我知道密钥i不存在,我返回(可以是任何字符串/字符) dic3i不存在本质上会给出{}.get('location', '#')哪个反过来会给出#,这肯定会导致成员资格失败d1,因此没关系)。

低调的 for 循环版本:

>>> ans = {}
>>> for k, v in dic2.items():
...     temp = []
...     for i in v:
...             if i in dic3 and dic3[i]['location'] in dic1[k]:
...                     temp.append(i)
...     ans[k] = temp
... 
>>> ans
{'T1': ['INC1'], 'T2': ['INC4'], 'T3': ['INC2']}

推荐阅读