从字典中以对形式删除键
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 的更多信息来改进。以上是关于从字典中以对形式删除键的主要内容,如果未能解决你的问题,请参考以下文章