Подтвердить что ты не робот

Python 2 → 3: объект типа "zip" не имеет len()

Я следую учебнику по нейронным сетям 1

Это в Python 2.7. Я использую 3.4. Это линия, которая меня беспокоит:

if test_data: n_test = len(test_data)

Я получаю: TypeError: object of type 'zip' has no len().

Есть ли способ переписать его так, чтобы он работал в версии 3.4?

4b9b3361

Ответ 1

Если вы знаете, что итератор конечен:

#NOTE: `sum()` consumes the iterator
n_test = sum(1 for _ in test_data) # find len(iterator)

Или, если вы знаете, что test_data всегда мал, а профилировщик говорит, что код является узким местом в вашем приложении, то здесь код, который может быть более эффективным для небольших n_test:

test_data = list(test_data)
n_test = len(test_data)

К сожалению, operator.length_hint() (Python 3.4+) возвращает ноль для объекта zip(). См. PEP 0424 - метод отображения подсказки длины.

Ответ 2

Немного поздно, чтобы ответить, но в случае, если кто-то еще наткнется на него: для этого же учебника по примеру нейронной сети оказалось, что мне пришлось обернуть 3 zip-вызова в mnist_loader со списком (zip (... )):

training_data = list(zip(training_inputs, training_results))
(...)
validation_data = list(zip(validation_inputs, va_d[1]))
(...)
test_data = list(zip(test_inputs, te_d[1]))

И потом это сработало.

Ответ 3

Измените значение zip().

foo = list(zip(...))

Ответ 4

Некоторая информация

Это связано с тем, что в Python 3.x, zip возвращает объект-генератор. Этот объект не является списком (он лучше), но он ведет себя как один. Вы можете попробовать выполнить итерацию через это следующим образом:

for i in zip([1,2,3,4], ['a','b','c','d']):
    print i

Быстрый ответ

Пожалуйста, покажите нам код, где произошла ошибка. Но я думаю, что я все еще могу дать вам быстрое (и не обязательно хорошее) решение.

включите этот

for i in reversed(range(1, len(x))):

в это:

for i in reversed(range(1, len(list(x))):