Когда я запускаю этот код:

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

Хотя есть много вопросов относительно этой ошибки, здесь никто не объясняет этот случай. Что могло быть не так?

4
Ramon Balthazar 31 Дек 2017 в 20:11

2 ответа

Лучший ответ

Проблема не в том, что filter не повторяется, а в том, что вы выполняете итеративную распаковку в заголовке цикла for:

for index, item in arr:
  # do something

Поскольку элементы arr являются целыми числами, вы не можете распаковать их в два значения (вы пишете index, item как «цель» присваивания, но как Python должен решить index, item = 1?). Вы можете использовать enumerate(..) отслеживать индекс:

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

enumerate(..) принимает на вход итерацию и создает итерацию кортежей, где каждый кортеж содержит index (как первый элемент), а элемент как второй элемент. Итак, enumerate([1, 'a', 25]) произведет (0, 1), (1, 'a'), (2, 25).


Если вам не нужен индекс, вы можете перебирать item без index:

for item in arr:
  # do something
6
Willem Van Onsem 31 Дек 2017 в 17:18

Если у кого-то есть трудности с пониманием enumerate, можно использовать следующее простое решение:

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

Я не тестировал его, но он может быть более эффективным, чем перечисление, поскольку позволит избежать накладных расходов.

0
rnso 31 Дек 2017 в 18:00