从 [list] 字典中删除多个值 python

Remove multiple values from [list] dictionary python

我试图从一个大字典中删除所有值 'x' 并且不删除任何键,但是当我 运行 代码时仍然有 'x' 值剩余。

这是我字典的摘录:

myDict = {0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2', 'x', 'x'], 2: ['id1', 'x', 'x', 'x']} 

到目前为止我的代码:

for k, v in myDict.iteritems():
if v == 'x':
    myDict.remove('x')
print myDict

我的目标是:

myDict = {0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']}

请问我应该如何删除列表中的 'x' 值?

只需这样做:

for key in myDict:
    while 'x' in myDict[key]:
        myDict[key].remove('x')

你的不起作用,因为你在字典上使用 .remove(),而不是在里面的列表上。您需要我使用的 while 循环,因为 .remove() 仅删除第一个循环。因此,我只是继续删除第一个,直到剩下 none。

您可以在字典理解中使用列表理解,如下所示:

myDict = {k:[el for el in v if el != 'x'] for k, v in myDict.items()}
print(myDict)

输出

{0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']}

对于python2只需做:

for k, v in myDict.iteritems():
    if v == 'x':
        myDict[k].remove('x')

问题是你从 dict 而不是 dict element(myDict[k]]

调用了 remove 方法

我认为你在 Python2 因为你使用了 iteritems()。对于 python 3,您可以使用 dict comprehensions 来完成,它不适用于第二个版本。

您的代码中有几个缺陷:

  1. 您是在字典本身而不是它作为值的列表上调用 remove

  2. 字典没有属性 remove

  3. v == 'x' 检查任何值是否等于 'x',这永远不会 True 因为你所有的值都是列表,可能会也可能不会 包含 'x'.

  4. 即使在列表本身上调用 remove 也只会删除第一次出现的 'x'

最简单的方法是新建字典:

>>> {k:[x for x in v if x!='x'] for k,v in myDict.iteritems()}
{0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']}

您也可以就地修改字典,并将值设置为新列表:

>>> for k,v in myDict.iteritems():
...     myDict[k] = [x for x in v if x!='x']
... 
>>> myDict
{0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']}

如果您更喜欢函数式方法,我在任何地方都使用列表理解,您可以改用 filter。演示:

>>> filter(lambda x: x!='x', ['id1', 'x', 'x', 'x'])
['id1']