python - 遍历字典列表并与其他字典进行比较
问题描述
我有以下字典
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 及其 INC 值。
- 如果 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 新手。我已经尝试了上面的代码片段,但我被击倒了。你能帮帮我吗?
解决方案
可以在单行中完成:
>>> {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
if dic3[i]['location']
is inside dic1[k]
,其中i
dict 中的键是 dictd3
和dictk
中的键。d2
d1
我使用dic3.get(i, {}).get('location', '#')
(而不是dic3[i]['location']
,你得到KeyError
的键INC5
不在dic3
)来避免键i
不在的问题(将为我的下一个dic3
返回一个空),然后我再次使用它来返回键的对应值,如果它存在并检查返回的字符串是否位于 dict 的值内。dict
.get
.get
location
d1
#
如果我知道密钥i
不存在,我返回(可以是任何字符串/字符) dic3
(i
不存在本质上会给出{}.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']}
推荐阅读
- wordpress - Wordpress 查询在 wp_query 中添加 0=1 并且结果消失
- html - 在网页中创建一个链接,允许通过加载指定的 kml 文件打开谷歌地球和/或谷歌地图
- prolog - 打印列表的元素,但以不同方式处理最后一个元素
- java - Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码
- graphql - 如何解决“变异返回数据为空”?
- arrays - 如何找到所有可能的重复组合而不重复?
- python - 如何使用 TCPSocket 获取字节数据?
- c - C - scanf 仅在特定字符序列之后将数字放在引号中
- spring - 扩展 Jhipster JWT (Spring) 单体应用程序以支持模拟
- angular - 无法以角度发送带有不记名令牌的表单数据