从字典中以对形式删除键

Posted

技术标签:

【中文标题】从字典中以对形式删除键【英文标题】:Removing keys in pair form from dictionary 【发布时间】:2022-01-10 09:16:46 【问题描述】:

假设我有一个 python 字典,tDosDict,就像

('M1', 'P1'): 6.0,
 ('M1', 'P2'): 10.0,
 ('M1', 'P3'): 4.0,
 ('M2', 'P1'): 7.0,
 ('M2', 'P2'): 6.0,
 ('M2', 'P3'): 5.0

我正在做一些操作说,

valMin = min(tDosDict.values())
jobsR = [key for key in tDosDict if tDosDict[key] == valMin]

所以我发现 jobsR 为 ('M1', 'P3')。现在我想从 tDosDict 中删除出现'P3' 的所有键。所以我更新的密钥将是

('M1', 'P1'): 6.0,
 ('M1', 'P2'): 10.0,
 ('M2', 'P1'): 7.0,
 ('M2', 'P2'): 6.0,

我将再次进行相同的操作来删除键。我尝试了以下方式,但它不起作用

for key, value in tDosDict.items():
    if jobsR[0][1] in key[1]:
        tDosDict.pop(jobsR[0][1], None)
    

请帮助我。此外,我必须将其推入循环以迭代该过程。

【问题讨论】:

不要从dict 中删除,而是使用您想要保留的元素创建新的dict。当您创建 jobsR 时,您可以使用 != 而不是 == 并且您将拥有没有元素的 tDosDict 【参考方案1】:

问题是您无法在迭代时编辑可迭代对象。为了解决这个问题,我列出了要删除的键,然后在单独的循环中将它们删除:

tDosDict = ('M1', 'P1'): 6.0,
 ('M1', 'P2'): 10.0,
 ('M1', 'P3'): 4.0,
 ('M2', 'P1'): 7.0,
 ('M2', 'P2'): 6.0,
 ('M2', 'P3'): 5.0
 
valMin = min(tDosDict.values())
jobsR = [key for key in tDosDict if tDosDict[key] == valMin]

remove_list = []
for key, value in tDosDict.items():
    if jobsR[0][1] in key[1]:
        remove_list.append(key)
for item in remove_list:
    tDosDict.pop(item)
    
print(tDosDict)

输出:

('M1', 'P1'): 6.0, ('M1', 'P2'): 10.0, ('M2', 'P1'): 7.0, ('M2', 'P2'): 6.0

【讨论】:

【参考方案2】:

像下面这样的迭代可以实现你所需要的——不需要迭代两次:

d = ('M1', 'P1'): 6.0, ('M1', 'P2'): 10.0, ('M1', 'P3'): 4.0, ('M2', 'P1'): 7.0, ('M2', 'P2'): 6.0, ('M2', 'P3'): 5.0

x: y for x, y in d.items() if x[0] in ["M1", "M2"] and x[1] != "P3"

输出

('M1', 'P1'): 6.0, ('M1', 'P2'): 10.0, ('M2', 'P1'): 7.0, ('M2', 'P2'): 6.0

【讨论】:

【参考方案3】:

不要从dict 中删除,而是直接使用您要保留的元素创建新的dict

使用!= 而不是==

tDosDict = key:val for key, val in tDosDict.items() if val != valMin

tDosDict = 
    ('M1', 'P1'): 6.0,
    ('M1', 'P2'): 10.0,
    ('M1', 'P3'): 4.0,
    ('M2', 'P1'): 7.0,
    ('M2', 'P2'): 6.0,
    ('M2', 'P3'): 5.0


valMin = min(tDosDict.values())
#jobsR = [key for key in tDosDict if tDosDict[key] == valMin]

tDosDict = key:val for key, val in tDosDict.items() if val != valMin

print(tDosDict)

【讨论】:

谢谢!在我附加值时如何通过循环继续这部分 我不知道你想做什么。什么loop?什么values?如果你有新问题,那么你应该在新页面上的新问题中描述它。【参考方案4】:

这也将提供所需的输出:

d = 
    ('M1', 'P1'): 6.0,
    ('M1', 'P2'): 10.0,
    ('M1', 'P3'): 4.0,
    ('M2', 'P1'): 7.0,
    ('M2', 'P2'): 6.0,
    ('M2', 'P3'): 5.0


valMin = min(d.values())
jobsR = [key for key in d if d[key] == valMin]

for key in [key for key in d if key[1] == jobsR[0][1] ]: del d[key]

print(d)

【讨论】:

您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。

以上是关于从字典中以对形式删除键的主要内容,如果未能解决你的问题,请参考以下文章

从Python中的字典中删除键[重复]

plist 形式的字典字典的键类型是啥?

Python基础入门—字典dict

为什么webview头键在android中以小写形式转换?

python的可逆字典

如何检查json返回值是数组还是字典的形式