item在python中的使用_列表.删除(item)在Python中,它是如何工作的?

其他答案已经提到,您在迭代列表的同时修改列表,并提供了更好的方法。我个人更喜欢列表理解法:odd_numbers = [item for item in numbers if item % 2 != 0]

对于你指定的一个很小的单子,我肯定会同意的。在

但是,这确实创建了一个新列表,如果您有一个非常大的列表,这可能是一个问题。在整数的情况下,大可能意味着至少数百万个,但准确地说,不管它有多大,它都会给你带来内存使用的问题。在这种情况下,这里有两种方法。在

一种方法与您问题中代码的意图类似。迭代列表,删除偶数。但是,为了避免修改正在迭代的列表可能导致的问题,可以向后迭代该列表。有一些方法可以向前迭代,但这更简单。在

下面是一种使用while循环的方法:

^{pr2}$

下面是另一种使用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),而不是{}。首先,.pop()效率更高,因为它提供了索引,而.remove()必须在列表中搜索第一个出现的值。第二,注意我说的“值的第一次出现”。这意味着除非每个项都是唯一的,否则使用.remove()将删除一个与循环当前所在的不同的项,从而最终将当前项留在列表中。在

我想再提一个解决方案,对于那些需要保留原始列表,但又不想使用太多内存来存储奇数副本的情况。如果您只想在奇数上迭代一次(或者您非常不喜欢使用内存,所以宁愿在需要时重新计算),那么可以使用生成器。这样做可以让您迭代列表中的奇数,而不需要任何额外的内存,除了生成器机制使用的无关紧要的内存之外。在

生成器表达式的定义与列表理解完全相同,只是它被括在括号中而不是方括号中:odd_numbers = (item for item in numbers if item % 2 != 0)

请记住,生成器表达式迭代原始列表,因此在迭代过程中更改原始列表将产生与在for循环中迭代列表时修改列表相同的问题。实际上,生成器表达式本身正在使用for循环。在

顺便说一句,生成器表达式不应该只放在非常大的列表中;我在不需要一次性计算整个列表的时候使用它们。在

总结/TLDR:

“最好”的方法完全取决于你在做什么,但这应该涵盖很多情况。在

假设列表是“小”或“大”:

如果列表很小,请使用列表理解(如果可以,甚至可以使用生成器表达式)。如果它很大,继续读。在

如果不需要原始列表,请使用while循环或for循环方法完全删除偶数(尽管使用.pop(),而不是.remove())。如果你确实需要原始列表,请继续阅读。在

如果只迭代奇数一次,请使用生成器表达式。如果您多次迭代它们,但您愿意重复计算以节省内存,请使用生成器表达式。在

如果您在奇数上迭代太多次而每次都无法重新计算它们,或者您需要随机访问,那么使用列表理解来生成一个只包含奇数的新列表。这会占用很多内存,但这是休息时间。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值