我正在尝试编写一些代码来操作列表,如下所示:
>>> a = [[0,0],[0,1],[0,2]]
>>> b = a[1]
>>> b[1] = 3
>>> a
[[0,0],[0,3],[0,2]]
>>> # So far so good
>>> del b
>>> a
[[0,0],[0,3],[0,2]]
>>> # Huh.
如何使用指向该项目的变量从列表中删除项目?
编辑:
好的,所以看起来这个操作在Python中是不可能的,考虑到它与迭代列表的pythonic方式相似,这似乎是一种耻辱。 C中的等效操作通过指针非常简单。在没有给出正确答案的情况下结束这个问题。
答案 0 :(得分:3)
引自del
docs,
删除名称会删除该名称与本地名称的绑定 全局命名空间,取决于名称是否出现在全局中 同一代码块中的语句。如果名称未绑定,则为NameError 异常将被提出。
因此,您实际上是取消名称b
与当前名称空间的链接,而不是从列表中删除数据。
传递删除属性引用,订阅和切片 涉及的主要对象;通常删除切片 相当于分配一个正确类型的空切片(但是甚至 这是由切片的对象确定的。
所以,你应该做
del a[1]
这是删除元素的正确方法。
编辑:这样做的唯一万无一失的方法就是这个
c = [0, 0]
a = [c, c, [0, 2]]
b = a[0]
for idx in xrange(len(a) - 1, -1, -1):
if a[idx] is b:
del a[idx]
print a # [[0, 2]]
或者您可以继续使用.remove
从列表中删除该项,直到它引发错误,例如
try:
while True:
a.remove(b)
except ValueError, e:
pass
print a
答案 1 :(得分:3)
不,你不能那样做。
del
只是取消实例对象中的var名称绑定。如果您想按索引对列表中的元素进行del,请使用pop(index)
:
In [46]: a=range(4)
In [47]: a.pop(2)
Out[47]: 2
In [48]: a
Out[48]: [0, 1, 3]
或del a[index]
:
In [50]: del a[2] #this time it deletes "3" in list "a"
In [51]: a
Out[51]: [0, 1]
答案 2 :(得分:1)
这是你想要的吗?
>>> a
[[0, 0], [0, 1], [0, 2]]
>>> del b[:]
>>> a
[[0, 0], [], [0, 2]]
答案 3 :(得分:1)
如果您不知道索引,请尝试以下操作。 (使用is
运算符测试对象标识)。
>>> c = [0, 0]
>>> a = [c, c, [0, 2]]
>>> b = a[0]
>>> for j in reversed([i for i, x in enumerate(a) if x is b]): # find indice.
... del a[j]
...
>>> a
[[0, 2]]
答案 4 :(得分:0)
您正在寻找a.remove(b)
。