我正在关注神经网络1
的教程它在Python 2.7中。我正在使用3.4。这是困扰我的路线:
if test_data: n_test = len(test_data)
我得到:TypeError: object of type 'zip' has no len()
。
有没有办法重写它以便它在3.4?
中工作答案 0 :(得分:30)
现在有点晚才回答,但万一其他人偶然发现它:对于同样的神经网络示例教程,原来我必须在mnist_loader中用一个列表包裹3个zip调用(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]))
然后它奏效了。
答案 1 :(得分:28)
如果你知道迭代器是有限的:
#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 -- A method for exposing a length hint。
答案 2 :(得分:8)
强制zip()
进行评估。
foo = list(zip(...))
答案 3 :(得分:2)
这是因为在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))):
答案 4 :(得分:0)
在mnist_loader中,将您的zip结果包装在list()
构造中,如下所示
def load_data_wrapper():
tr_d, va_d, te_d = load_data()
training_inputs = [np.reshape(x, (784,1)) for x in tr_d[0]]
training_results = [vectorized_result(y) for y in tr_d[1]]
training_data = list(zip(training_inputs, training_results))
validation_inputs = [np.reshape(x,(784, 1))for x in va_d[0]]
validation_data = list(zip(validation_inputs, va_d[1]))
test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]]
test_data = list(zip(test_inputs, te_d[1]))
return(training_data, validation_data, test_data)