【问题标题】: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

标签: python python-3.x dictionary


【解决方案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 的更多信息来改进。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多