从 [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 来完成,它不适用于第二个版本。
您的代码中有几个缺陷:
您是在字典本身而不是它作为值的列表上调用 remove
。
字典没有属性 remove
。
v == 'x'
检查任何值是否等于 'x'
,这永远不会 True
因为你所有的值都是列表,可能会也可能不会 包含 'x'
.
即使在列表本身上调用 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']
我试图从一个大字典中删除所有值 '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 来完成,它不适用于第二个版本。
您的代码中有几个缺陷:
您是在字典本身而不是它作为值的列表上调用
remove
。字典没有属性
remove
。v == 'x'
检查任何值是否等于'x'
,这永远不会True
因为你所有的值都是列表,可能会也可能不会 包含'x'
.即使在列表本身上调用
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']