为什么字典没有remove方法?

4

我知道Python中的列表有一个remove()方法,可以从列表中删除给定的对象。

aList = [123, 'xyz', 'zara', 'abc', 'xyz']
aList.remove('xyz')

我知道我们可以使用del语句通过偏移量从列表中删除一个项目:

del aList[-1]

我知道我们可以使用del语句通过键删除字典中的项:
aDict = {'a':1, 'b':2 'c':3}
del aDict['a']

然而,字典中并没有remove()方法,我认为这是完全可以接受的:

aDict.remove('a')

我猜其中一个原因是remove()在字典中并没有比del语句节省任何打字时间,所以它不是必要的。这个说法正确吗?

而对于列表,remove()将"按值查找索引"和"按索引删除"结合在一起,因此必须存在。这个说法正确吗?

如果有其他原因,那是什么?

4个回答

4
如果你看这个问题:Difference between del, remove and pop on lists,你会注意到主要答案指出:
remove:删除第一个匹配的值,而不是特定的索引
del:删除特定的索引 pop:返回被删除的元素
所以对于字典来说,它根本不需要一个remove方法,因为一个键只能有一个实例(它们必须是唯一的),del就足够了。

同意。然而,@MisterMiyagi的答案更接近。无论如何,还是谢谢你。 - milesma

4
请注意,list.remove 的严格保证是删除一个第一个出现位置。而在 dict 中,元素的顺序是任意的 - 没有所谓的“第一个”。

1
所以你的意思是对字典应用remove()是概念上错误的,因为字典没有“第一个”。我喜欢这个。 - milesma
1
这只是我能想到的第一个问题。还有其他一些问题 - list 的大小基本上是固定的,因此您可以“猜测”remove需要多长时间。相比之下,dict 可能比其包含的数据任意大。在许多情况下,Python 避免使用可能会暗示快速性能的接口,而实际上它们很慢。 - MisterMiyagi
为什么set支持remove方法?而且在set中,值也没有顺序。 - undefined

3

它确实可以,只是被称为 pop:

pop(key[, default])
如果 key 在字典中,删除它并返回其值;否则返回 default。如果没有给定 default 并且 key 不在字典中,则会引发 KeyError。


1
dict.pop() 有一个特定的结果,这也是它通常被使用的目的。 - Ignacio Vazquez-Abrams
1
@JGreenwell 谁说字典和列表一定要有相同的方法名称? - DeepSpace
1
@DeepSpace 不对。pop() 返回已删除的项,而 del() 则不会。无论如何,我只是开了个小玩笑。 - SiHa
1
请注意,pop 将根据 身份删除元素,而 remove 将根据 身份删除元素。 - MisterMiyagi
顺便说一下,copyclearpop实际上是列表和字典共有的唯一不平凡的方法:li = set(dir(list)); dic = set(dir(dict)); print([method for method in li & dic if not method.startswith('_')]); ['copy','pop','clear'] - DeepSpace
显示剩余4条评论

1
字典有pop,但没有remove。为什么?因为remove会查找并删除第一个匹配的值,并且不返回任何内容。所以在字典中:
{'a': 5, 'b': 5}

dict.remove 应该删除 。如果我使用 dict.remove(5),那么它应该删除哪个键?此外,这甚至不是非常有用的操作。如果你需要从字典中删除某个特定的 ,那么你正在使用错误的数据结构。


dct.pop(key)

另一方面,它不是不像。
value = dct[key]
del dct[key]
return value

这与列表的pop方法形成对比:
lst.pop(index)

is analogous to

value = lst[index]
del lst[index]
return value

那就是说,它们俩都使用相同的原理运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接