我想删除列表中的所有偶数。但有些东西弄糊涂了我..。这是密码。
lst = [4,4,5,5]
for i in lst:
if i % 2 == 0:
print i
lst.remove(i)
print lst它打印4,5,5为什么不打印5,5
发布于 2015-08-17 07:46:09
其他答案已经提到,您正在修改列表,同时迭代它,并提供了更好的方法来实现它。就我个人而言,我更喜欢清单理解方法:
odd_numbers = [item for item in numbers if item % 2 != 0]对于你指定的一个很小的例子,我肯定会同意的。
但是,这确实会创建一个新的列表,如果您有一个非常大的列表,这可能是一个问题。在整数的情况下,大可能至少意味着数百万,但准确地说,无论需要多大,它开始给您带来内存使用问题。在这种情况下,这里有几种方法。
一种方法类似于您问题中代码的意图。遍历列表,删除偶数。但是,为了避免修改正在迭代的列表可能导致的问题,您可以向后迭代。有一些方法可以迭代前进,但这更简单。
这里有一种使用while循环的方法:
# A one hundred million item list that we don't want to copy
# even just the odd numbers from to put into a new list.
numbers = range(100000000) # list(range(100000000)) in Python 3
index = len(numbers) - 1 # Start on the index of the last item
while index >= 0:
if numbers[index] % 2 == 0:
numbers.pop(index)
index -= 1下面是使用for循环的另一种方法:
# A one hundred million item list that we don't want to copy
# even just the odd numbers from to put into a new list.
numbers = range(100000000) # list(range(100000000)) in Python 3
for index in xrange(len(numbers) - 1, -1, -1): # range(...) in Python 3
if numbers[index] % 2 == 0:
numbers.pop(index)注意,在while循环和for循环版本中,我使用的都是numbers.pop(index),而不是numbers.remove(numbers[index])。首先,.pop()的效率要高得多,因为它提供了索引,而.remove()必须在列表中搜索值的第一次出现。第二,注意我说的,“值的第一次出现”。这意味着,除非每个项都是唯一的,否则使用.remove()将删除与循环当前打开的项不同的项,这将最终将当前项留在列表中。
我还想再提一种解决方案,在需要保留原始列表的情况下,但不希望使用过多的内存来存储奇数副本。如果您只想迭代一次奇数(或者您非常不愿意使用内存,因此您更愿意在需要时重新计算),则可以使用生成器。这样做可以让您迭代列表中的奇数,而不需要任何额外的内存,除了生成器机制使用的不必要的数量之外。
生成器表达式的定义与列表理解完全一样,只不过它被括在括号中而不是方括号中:
odd_numbers = (item for item in numbers if item % 2 != 0)请记住,生成器表达式正在迭代原始列表,因此在迭代过程中更改原始列表将给您带来与在for循环中迭代列表时修改列表相同的问题。实际上,生成器表达式本身使用的是for循环。
顺便说一句,生成器表达式不应该只放在非常大的列表中;每当不需要一次计算整个列表时,我就使用它们。
摘要/土地退化和退化:
“最好”的方法完全取决于你在做什么,但这应该涵盖很多情况。
假设列表不是“小的”就是“大的”:
如果您的列表很小,请使用列表理解(如果可以的话甚至使用生成器表达式)。如果是大的,继续读。
如果不需要原始列表,可以使用while循环或for循环方法完全删除偶数(虽然使用的是.pop(),而不是.remove())。如果您需要原始列表,请继续阅读。
如果您只迭代奇数一次,请使用生成器表达式。如果您对它们进行了多次迭代,但是您愿意重复计算以节省内存,请使用生成器表达式。
如果你在奇数上重复了太多次,每次都要重新计算它们,或者你需要随机访问,那么使用一个列表理解来生成一个新的列表,其中只有奇数。它会占用大量的内存,但它们是间断的。
https://stackoverflow.com/questions/32043963
复制相似问题