【问题标题】:Remove element in dictionary of lists删除列表字典中的元素
【发布时间】:2019-08-22 18:56:48
【问题描述】:

我正在编写 Python 代码以删除列表字典中的某些元素。

dict ={'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
values = ['a','c','f']

list2 ={i:j.remove(value) for i,j in dict.items() for k in j for value in values if value in k}

print(list2)

下面的代码正在工作,给出预期的结果。我面临理解问题(上述代码)

for i,j in dict.items():

    for k in j:

        for value in values:

            if value in k:

                j.remove(value)

我不确定为什么理解不起作用。请帮助我解决这个问题的有效方法

实际结果:

{'s': None, 'd': None, 'g': None}

预期结果:

{'s': ['b'], 'd': ['d'], 'g': ['e']}

【问题讨论】:

  • j.remove 返回None,它是一个就地函数,这就是为什么你的字典被None填充的原因
  • 嵌套代码循环也不起作用,因为从您正在迭代的列表中删除元素会导致问题。
  • 有有效的方法吗?
  • remove 返回None。 .也永远不要使用dict 来命名字典

标签: python list dictionary dictionary-comprehension


【解决方案1】:

使用zip()

理解

dict_ ={'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
values = ['a','c','f']

for (k,v), elem  in zip(dict_.items(), values):
    if elem in v:
        v.remove(elem)
print(dict_)

使用dict-comprehension

可以这样想:

如果列表values元素不在列表value dict_

中的键
print({k:v for (k,v), elem  in zip(dict.items(), values) if elem not in v })

输出

{'s': ['b'], 'd': ['d'], 'g': ['e']}

【讨论】:

    【解决方案2】:

    不要尝试在迭代中改变列表,只需通过迭代 j 的成员来检查 values 的成员身份:

    d ={'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
    values = ['a','c','f']
    
    list2 ={i: [a for a in j if a not in values] for i,j in d.items()}
    
    print(list2)
    {'s': ['b'], 'd': ['d'], 'g': ['e']}
    

    作为旁注,我还删除了 dict 变量名,因为它隐藏了一个内置函数。这绝对是要避免的事情,因为您以后可能会遇到一些不确定的行为:

    
    dict = {'a': 1}
    
    d = dict([('b',2), ('c',3)])
    
    TypeError: 'dict' object is not callable
    

    【讨论】:

      【解决方案3】:

      我会将您的 dict 变量重命名为 dict 以外的其他名称:

      d = {'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
      values = ['a','c','f']
      

      只需使用列表推导来获取每个列表中不在values 中的项目:

      d2 = {k:[i for i in v if i not in values] for k, v in d.items()}
      

      【讨论】:

        猜你喜欢
        • 2016-05-06
        • 1970-01-01
        • 2023-01-12
        • 2019-06-04
        • 2021-10-31
        • 2016-07-26
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多