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分钟,可能当时加载了旧版本。当我加上我的答案时,他的答案肯定不在那里。