Python删除for循环中的元素
[注意:即使使用临时数组(不修改循环数组),代码也没有给出列表Python删除for循环中的元素,python,Python,[注意:即使使用临时数组(不修改循环数组),代码也没有给出列表b的正确答案] 从列表中删除奇数,代码见下文。 为什么它适用于列表a,而不是列表b?多谢各位 def purify(numbers): numbers_buf = numbers for item in numbers: if item % 2 == 1: numbers_buf.remove(item) return numbers_buf a = [1,2,3,4]
b
的正确答案]
从列表中删除奇数,代码见下文。
为什么它适用于列表a
,而不是列表b
?多谢各位
def purify(numbers):
numbers_buf = numbers
for item in numbers:
if item % 2 == 1:
numbers_buf.remove(item)
return numbers_buf
a = [1,2,3,4]
print purify(a)
[2, 4]
b = [4,5,5,4]
print purify(b)
[4,5,4]
这已经被问过很多次了,看看 你真的应该做:
even = [a for a in numbers if a%2 == 0]
这已经被问过很多次了,看看 你真的应该做:
even = [a for a in numbers if a%2 == 0]
你正在做两件你可能不应该做的事情,因为他们都在自找麻烦
a = [1,2,3,4]
print purify(a) #=> [2, 4]
print a #=> [2, 4]
排序
和排序
内置):
你正在做两件你可能不应该做的事情,因为他们都在自找麻烦
a = [1,2,3,4]
print purify(a) #=> [2, 4]
print a #=> [2, 4]
排序
和排序
内置):
在遍历列表时操作/删除元素将更改元素的索引,numbers\u buf=numbers
创建对numbers
列表的引用,基本上是指向同一对象的指针,因此从一个对象中删除,从两个对象中删除
使用numbers[:]
创建副本/新对象
运行以下函数以帮助澄清,请参见3和4如何以某种方式运行程序:
def purify(numbers):
numbers_buf = numbers
should_be = numbers[:]
for ind, item in enumerate(numbers):
print("{} should be at {}, is at {}".format(item,should_be.index(item),ind))
if item % 2:
numbers_buf.remove(item)
return numbers_buf
print(purify([4,5,4,7,3,1]))
如果确实希望使用列表组件修改原始对象:
def purify(numbers):
numbers[:] = [x for x in numbers if not x % 2]
return numbers
您还可以使用反向
:
def purify(numbers):
for item in reversed(numbers):
if item % 2:
numbers.remove(item)
return numbers
在遍历列表时操作/删除元素将更改元素的索引,numbers\u buf=numbers
创建对numbers
列表的引用,基本上是指向同一对象的指针,因此从一个对象中删除,从两个对象中删除
使用numbers[:]
创建副本/新对象
运行以下函数以帮助澄清,请参见3和4如何以某种方式运行程序:
def purify(numbers):
numbers_buf = numbers
should_be = numbers[:]
for ind, item in enumerate(numbers):
print("{} should be at {}, is at {}".format(item,should_be.index(item),ind))
if item % 2:
numbers_buf.remove(item)
return numbers_buf
print(purify([4,5,4,7,3,1]))
如果确实希望使用列表组件修改原始对象:
def purify(numbers):
numbers[:] = [x for x in numbers if not x % 2]
return numbers
您还可以使用反向
:
def purify(numbers):
for item in reversed(numbers):
if item % 2:
numbers.remove(item)
return numbers
如果要使用remove方法保留并返回相同的列表,可以尝试以下操作:
def purify(numbers):
for item in numbers:
if item % 2 == 1:
count = numbers.count(item)
for i in range(count):
numbers.remove(item)
return numbers
如果要使用remove方法保留并返回相同的列表,可以尝试以下操作:
def purify(numbers):
for item in numbers:
if item % 2 == 1:
count = numbers.count(item)
for i in range(count):
numbers.remove(item)
return numbers
你的问题源于这样一个事实,即你没有像你希望的那样,在一个不同的列表上循环。您希望避免在列表上循环时从列表中删除某些内容,这就是为什么您使用
numbers\u buf=numbers
但是,请注意,没有创建新列表:
In [73]: numbers = list(range(10))
In [74]: numbers
Out[74]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [75]: id(numbers)
Out[75]: 4469310792
In [76]: numbers_buf = numbers
In [77]: id(numbers)
Out[77]: 4469310792
In [78]: id(numbers_buf)
Out[78]: 4469310792
In [79]: id(numbers_buf) == id(numbers)
Out[79]: True
In [80]: numbers
Out[80]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [81]: numbers_buf
Out[81]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [82]: numbers.append(10)
In [83]: numbers_buf
Out[83]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
最后请注意,当我将10
附加到numbers
时,它也会附加到numbers\u buf
。这是因为python在创建包含数字的新列表时,不会创建包含数字的新列表;它只需创建名称numbers\u buf
,并使其指向与numbers
指向的结构完全相同的结构(这就是id(numbers)
东西显示的内容)。您可以按如下方式解决此问题:
In [84]: numbers_buf_new = numbers[:]
In [85]: id(numbers_buf_new)
Out[85]: 4469329032
In [86]: id(numbers_buf_new) == id(numbers)
Out[86]: False
In [87]: numbers
Out[87]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [88]: numbers_buf_new
Out[88]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [89]: numbers.append(11)
In [90]: numbers
Out[90]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
In [91]: numbers_buf_new
Out[91]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
你的问题源于这样一个事实,即你没有像你希望的那样,在一个不同的列表上循环。您希望避免在列表上循环时从列表中删除某些内容,这就是为什么您使用
numbers\u buf=numbers
但是,请注意,没有创建新列表:
In [73]: numbers = list(range(10))
In [74]: numbers
Out[74]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [75]: id(numbers)
Out[75]: 4469310792
In [76]: numbers_buf = numbers
In [77]: id(numbers)
Out[77]: 4469310792
In [78]: id(numbers_buf)
Out[78]: 4469310792
In [79]: id(numbers_buf) == id(numbers)
Out[79]: True
In [80]: numbers
Out[80]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [81]: numbers_buf
Out[81]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [82]: numbers.append(10)
In [83]: numbers_buf
Out[83]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
最后请注意,当我将10
附加到numbers
时,它也会附加到numbers\u buf
。这是因为python在创建包含数字的新列表时,不会创建包含数字的新列表;它只需创建名称numbers\u buf
,并使其指向与numbers
指向的结构完全相同的结构(这就是id(numbers)
东西显示的内容)。您可以按如下方式解决此问题:
In [84]: numbers_buf_new = numbers[:]
In [85]: id(numbers_buf_new)
Out[85]: 4469329032
In [86]: id(numbers_buf_new) == id(numbers)
Out[86]: False
In [87]: numbers
Out[87]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [88]: numbers_buf_new
Out[88]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [89]: numbers.append(11)
In [90]: numbers
Out[90]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
In [91]: numbers_buf_new
Out[91]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
您的函数以另一种方式工作,超出了您的预期。for循环使用第一个元素,而不是第二个元素,等等,所以当您删除一个元素时,其他元素会改变它们的位置,并且当它们前面有另一个奇数时,可以被它跳过(在您的例子中就是这样) 您可以改为使用此代码:
def purify(numbers):
return [x for x in numbers if x % 2 == 0]
它将分别为a和b返回[2,4][4,4]。for循环使用第一个元素,而不是第二个元素,等等,所以当您删除一个元素时,其他元素会改变它们的位置,并且当它们前面有另一个奇数时,可以被它跳过(在您的例子中就是这样) 您可以改为使用此代码:
def purify(numbers):
return [x for x in numbers if x % 2 == 0]
它将分别为a和b返回[2,4][4,4]如果没有必要修改列表,请尝试列表理解,如
返回[x代表x,如果不是x%2]
您可以检查@James Sapam,其中一个也被标记为重复。它链接到我4-5年前的评论:DIf如果没有必要修改列表,请尝试列表理解,如返回[x代表x,如果不是x%2]
你能检查这个@James Sapam吗