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 中工作?

原文由 Ada Stra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 654
2 个回答

如果您知道迭代器是有限的:

 #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 - 一种公开长度提示的方法

原文由 jfs 发布,翻译遵循 CC BY-SA 3.0 许可协议

现在回答有点晚了,但以防万一其他人偶然发现它:对于同一个神经网络示例教程,结果我不得不用 list(zip(…)) 构造将 mnist_loader 中的 3 个 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]))

然后它起作用了。

原文由 Nicolas Turgeon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题