Python 2 - > 3:'zip'类型的对象没有len()

时间:2015-06-23 19:19:33

标签: python-2.7 python-3.x

我正在关注神经网络1

的教程

它在Python 2.7中。我正在使用3.4。这是困扰我的路线:

if test_data: n_test = len(test_data)

我得到:TypeError: object of type 'zip' has no len()

有没有办法重写它以便它在3.4?

中工作

5 个答案:

答案 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)