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?
Ответы
Ответ 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))):