Python 如何删除一个值,但在字典中保留相应的键?

Python 如何删除一个值,但在字典中保留相应的键?,python,Python,假设我有一本字典: D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]} 我想从D1中删除所有3s,以便获得: D1 = {'A1' : [2], 'B1': [], 'C1' : [4, 5]} 类似这样的方法可以工作,假设3总是出现在值中,而不是键中 >>> for v in D1.values(): ... if 3 in v: ... v.remove(3) ... >>> D1

假设我有一本字典:

D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
我想从
D1
中删除所有
3
s,以便获得:

D1 = {'A1' : [2], 'B1': [], 'C1' : [4, 5]}

类似这样的方法可以工作,假设3总是出现在值中,而不是键中

>>> for v in D1.values():
...     if 3 in v:
...         v.remove(3)
...
>>> D1
{'A1': [2], 'C1': [4, 5], 'B1': [3]}
编辑:刚刚意识到可以多次出现,请尝试此项

>>> D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
>>> for k, v in D1.items():
...     D1[k] = filter(lambda x: x!=3, v)
...
>>> D1
{'A1': [2], 'C1': [4, 5], 'B1': []}

类似这样的方法可以工作,假设3总是出现在值中,而不是键中

>>> for v in D1.values():
...     if 3 in v:
...         v.remove(3)
...
>>> D1
{'A1': [2], 'C1': [4, 5], 'B1': [3]}
编辑:刚刚意识到可以多次出现,请尝试此项

>>> D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
>>> for k, v in D1.items():
...     D1[k] = filter(lambda x: x!=3, v)
...
>>> D1
{'A1': [2], 'C1': [4, 5], 'B1': []}

迭代
D1
的键,获取列表并从中删除
3
s

D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
def rem_d(D1,n):
    for d in D1:
        D1[d] = [i for i in D1[d] if i != n]

rem_d(D1,3)
D1
{'A1' : [2], 'B1': [], 'C1' : [4, 5]}

迭代
D1
的键,获取列表并从中删除
3
s

D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
def rem_d(D1,n):
    for d in D1:
        D1[d] = [i for i in D1[d] if i != n]

rem_d(D1,3)
D1
{'A1' : [2], 'B1': [], 'C1' : [4, 5]}
请注意,这是一种奇怪且低效的数据结构方式,删除需要一段时间

请注意,这是一种奇怪且低效的数据结构方式,删除需要一段时间。

这里有一个简单的例子:

threeless = {k: [e for e in v if e != 3] for k, v in D1.iteritems()}
这是一条单行线:

threeless = {k: [e for e in v if e != 3] for k, v in D1.iteritems()}

下面是一种循环遍历列表上的键和调用过滤器的方法:

>>> D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
>>> for k in D1:
...    D1[k] = filter(lambda v: v != 3, D1[k])
... 
>>> D1
{'A1': [2], 'C1': [4, 5], 'B1': []}

下面是一种循环遍历列表上的键和调用过滤器的方法:

>>> D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}
>>> for k in D1:
...    D1[k] = filter(lambda v: v != 3, D1[k])
... 
>>> D1
{'A1': [2], 'C1': [4, 5], 'B1': []}

在我看来,我读到的所有答案似乎都在创造一个新的对象:Eric答案中的新dic,其他答案中的新列表

我认为最好对每个列表进行就地修改,尤其是当字典中的项目数量和/或列表中的元素数量较大时:

D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}

for li in D1.itervalues():
    while 3 in li:
        li.remove(3)

在我看来,我读到的所有答案似乎都在创造一个新的对象:Eric答案中的新dic,其他答案中的新列表

我认为最好对每个列表进行就地修改,尤其是当字典中的项目数量和/或列表中的元素数量较大时:

D1 = {'A1' : [2, 3], 'B1': [3, 3], 'C1' : [4, 5]}

for li in D1.itervalues():
    while 3 in li:
        li.remove(3)


B1还有一个3。。。此外,删除您正在迭代的内容(使用filter:)@Haidro:更改)中的某些内容是不明智的,这仅适用于删除了元素的列表是您正在迭代的列表。这不是怎么回事B1里还有个3。。。此外,删除您正在迭代的内容(使用filter:)@Haidro:更改)中的某些内容是不明智的,这仅适用于删除了元素的列表是您正在迭代的列表。这里并不是这么回事。使用名为
list
的变量或任何其他python类型来实现这一点是一个可怕的想法matter@inspectorG4dget:哎呀,哎呀。修正了。使用名为
list
的变量或任何其他python类型的变量是一个可怕的想法matter@inspectorG4dget:哎呀,哎呀。修正了。为什么不把字典作为另一个参数传递呢?哦,我想,他只想把它用于
D1
。传递字典会复制一个需要额外空间的全新字典。为什么将字典传递给函数会创建字典的副本?这只是一个参考。为什么不把字典作为另一个参数传递呢?哦,我想,他只想把它用于
D1
。传递字典会复制一个需要额外空间的全新字典。为什么将字典传递给函数会创建字典的副本?这只是一个参考。谢谢,这是一个很好的解决方案,尽管它实际上与@marcadian的第二个解决方案完全相同,他是在我之后添加的。@jterrace:不这样认为-他的帖子比你的早了12分钟。即使算上宽限期,您的答案的第一次修订版也比hisI的最后一次修订版至少早7分钟,可能当时加载了旧版本。当我添加我的答案时,他的答案肯定不在那里。谢谢,这是一个很好的解决方案,尽管它实际上与@marcadian的第二个解决方案完全相同。他在我之后添加了它。@jterrace:不这样认为-他的帖子比你的早12分钟。即使算上宽限期,您的答案的第一次修订版也比hisI的最后一次修订版至少早7分钟,可能当时加载了旧版本。当我加上我的答案时,他的答案肯定不在那里。