【问题标题】:Elements skipped when trying to remove from a list [duplicate]尝试从列表中删除时跳过的元素[重复]
【发布时间】:2019-03-09 08:39:59
【问题描述】:

我有一个浮点数列表,我想删除大于某个数字或小于某个(不同)数字的元素。这是我到目前为止的代码:

a = ['239.12835442230858', '22.756759356300982', '32.98715001831536', '460.11899977144816', '747.5029387021966', '25.97292253382583', '150.94457242947556', '197.14098031753895', '394.44390781374057', '320.11301380981826', '138.66237294322895', '87.7095435481745', '427.8799219223041', '445.9006435386053', '62.716459379313704', '259.19872485615906', '212.75590521862267', '455.3882240904654', '259.07638854400676', '425.90576134140446']
print type(a[0])
for i, val in enumerate(a):
    a[i] = float(val)

print type(a[0])

for i in a:
    if i < 30 or i > 200:
        a.remove(i)

但这并没有像我预期的那样工作。当我在这里可视化这段代码时:http://www.pythontutor.com/visualize.html,它似乎跳过了被删除元素之后的元素。我看不出为什么我的代码会出现这种情况。

附:我知道我可以使用np.where 做我想做的事情,但我想知道为什么我当前的代码不起作用。

【问题讨论】:

  • 我有兴趣看到对所提出的确切问题的答案,而不是给出所需输出的代码。为什么执行此方法时会跳过某些元素?
  • @d_kennetz:列表迭代器是基于索引的。如果在迭代时删除一个元素,下一个值将向下移动到当前索引,然后迭代器将索引推进到下一个项目,跳过刚刚向下移动的项目。我发誓这个问题已经被问过十几次了(只是添加了四个重复,还有很多)。
  • 哈哈阴影关掉它!

标签: python


【解决方案1】:

您在迭代列表时正在修改列表。改为进行列表推导:

[i for i in a if not (i < 30 or i > 200)]

【讨论】:

  • 啊!有道理,谢谢
  • 但是为什么会跳过元素呢?我对他原来的问题很感兴趣。我知道这段代码给出了所需的行为,但我很好奇为什么某些满足这两个条件的项目没有被删除。
  • 如果你简单地进行操作:for i in a: if float(i) &gt; 200: a.remove(i) 你实际上仍然得到 > 200 的值。当我尝试它时,浮动 747. 和 445. 仍然徘徊。
  • 此列表理解返回的值是您尝试删除的值
  • @vash_the_stampede 你是对的,我会相应地编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2015-01-05
  • 2012-05-09
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多