我有以下词典
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 中的值
示例:
图片中有详细说明。我期待以下输出。
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 新手。我已经尝试了上面的代码片段,但我被打倒了。你能帮帮我吗。
答案 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', '#')
是列表推导式,如果 dic2
在 dic3[i]['location']
内,则仅从 dic1[k]
的列表中选取值,其中 i
是dict d3
和 k
是来自 dict d2
和 dict d1
的键。
我使用了 dic3.get(i, {}).get('location', '#')
(而不是 dic3[i]['location']
,对于不在 KeyError
中的键 INC5
,您得到 dic3
)来避免键 { {1}} 不在 i
中(将为我的下一个 dic3
返回一个空的 dict
)并且在第二个 .get
中,我再次使用它来返回 {{ 1}} 键的对应值(如果存在)并检查返回的字符串是否位于 dict .get
的值内。
如果我知道键 location
在 d1
中不存在,我返回 #
(可以是任何字符串/字符)(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])}