过滤后不能迭代列表

时间:2017-12-31 17:11:19

标签: python python-3.x

当我运行此代码时:

arr = list(filter(lambda x: x > 0, arr))
for index, item in arr:
  # do something

我收到此错误

  

TypeError:' int'对象不可迭代

哪个没有意义,因为我有list而不是int。 测试arr会产生:

>>> print(arr)
[822]
>>> print(type(arr))
<class 'list'>
>>> print(len(arr))
1

虽然这个类型错误有很多问题,但这里没有解释这个案例。 什么可能是错的?

2 个答案:

答案 0 :(得分:6)

问题不是filter不可迭代,而是你在for循环的头部进行 iterable unpacking 的事实:

for index, item in arr:
  # do something

由于arr的元素是整数,因此您无法将它们解压缩为两个值(您将index, item写为赋值的“目标”,但Python应如何解决index, item = 1 ?)。您可以使用enumerate(..)来跟踪索引:

for index, item in enumerate(arr):
  # do something

enumerate(..)将迭代作为输入,并生成一个可迭代的元组,其中每个元组包含索引(作为第一项),元素作为第二项。因此enumerate([1, 'a', 25])将生成(0, 1), (1, 'a'), (2, 25)

如果您不需要索引,则可以在没有item的情况下迭代index

for item in arr:
  # do something

答案 1 :(得分:0)

如果您难以理解enumerate,可以使用以下简单的解决方法:

arr = list(filter(lambda x: x > 0, arr))
for index in range(len(arr)):
    item = arr[index]
    # do something with item and index

我没有对它进行测试,但它可能比枚举更有效,因为它可以避免开销。