遍历字典列表并与其他字典进行比较

时间:2021-01-16 18:20:39

标签: python python-3.x list dictionary

我有以下词典

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']}

enter image description here

示例代码:

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 新手。我已经尝试了上面的代码片段,但我被打倒了。你能帮帮我吗。

3 个答案:

答案 0 :(得分:5)

可以单线完成:

>>> {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', '#') 是列表推导式,如果 dic2dic3[i]['location'] 内,则仅从 dic1[k] 的列表中选取值,其中 i 是dict d3k 是来自 dict d2 和 dict d1 的键。

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

如果我知道键 locationd1 中不存在,我返回 #(可以是任何字符串/字符)(i 不存在本质上会给dic3 反过来会给 i,这肯定会使 {}.get('location', '#') 中的成员资格失败,因此没关系)。

淡化 for 循环版本:

#

答案 1 :(得分:1)

根据我的理解,您应该修改原始 dic2 字典而不是为您的答案创建一个新字典,这就是我得到的:

delete = []

for key, value in dic2.items():
    loc = dic1[key][5:]
    for inc in value:
        if inc not in dic3:
            delete.append(inc)
        else:
            if loc != dic3.get(inc)['location']:
                delete.append(inc)

    for item in delete:
        value.remove(item)
    delete = []

print(dic2)

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

第一个 for 循环遍历 dic2 并将所需的位置设置为变量 loc。下一个遍历列表(值)并将它们添加到删除列表中。 在每个循环结束时,它遍历删除列表,从值列表中删除每个元素,然后将删除设置为空列表。

我对 python 也比较陌生,所以我确定可能存在效率问题。

答案 2 :(得分:0)

这与其他答案基本上相同,但作为单行,它可能更具可读性(可能不是,因为它是主观的)。

{k: [el] for k, v in dic2.items() for el in v if (el in dic3.keys() and dic3[el]['location'] in dic1[k])}
相关问题