Python 2.7 Python 2-->;3:类型为'的对象;拉链';没有len()
我正在学习神经网络教程 它在Python2.7中。我用的是3.4。这是困扰我的一句话:Python 2.7 Python 2-->;3:类型为'的对象;拉链';没有len(),python-2.7,python-3.x,Python 2.7,Python 3.x,我正在学习神经网络教程 它在Python2.7中。我用的是3.4。这是困扰我的一句话: 如果测试数据:n\u test=len(测试数据) 我得到:TypeError:zip类型的对象没有len() 有没有办法重写它,使其在3.4中工作?强制zip()进行计算 foo = list(zip(...)) 如果您知道迭代器是有限的: #NOTE: `sum()` consumes the iterator n_test = sum(1 for _ in test_data) # find len(
如果测试数据:n\u test=len(测试数据)
我得到:TypeError:zip类型的对象没有len()
有没有办法重写它,使其在3.4中工作?强制zip()
进行计算
foo = list(zip(...))
如果您知道迭代器是有限的:
#NOTE: `sum()` consumes the iterator
n_test = sum(1 for _ in test_data) # find len(iterator)
或者,如果您知道test\u数据总是很小,并且探查器说代码是应用程序中的瓶颈,那么下面的代码对于小型n\u测试来说可能更有效:
test_data = list(test_data)
n_test = len(test_data)
不幸的是,(Python3.4+)对于zip()
对象返回零。请参阅。现在回答有点晚,但万一其他人偶然发现:对于同一个神经网络示例教程,我不得不在mnist_加载器中用一个列表(zip(…)结构包装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]))
然后它成功了。一些信息
这是因为在Python3.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))):
在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)
相关的:相关的:如果你可以访问两个已经压缩的iterables,只需计算两者的长度,取较小的一个。zip的长度不会与此有任何不同。请尝试使用list(zip(…)
当您遇到zip(…)
同样的问题时,程序正在尝试执行类似zip(…)[i]
的操作。最好是定义一个新变量new\u var=list(zip(…)
并替换zip(…)
使用new\u var
。您应该在if
检查之前执行test\u data=list(test\u data)
,否则if test\u data
将始终为真,即使对于空的zip
。也可能值得指出的是sum(…)
将使用zip
我明白你的意思……事实上,如果它只是一个空列表,则不需要检查if
(那么n\u test
将仅为0)。尽管如此,还是值得一提,以防万一。现在仔细研究你的建议,非常感谢。这是其他人的代码,我承认这扩展了我的能力。干杯!对性能更好的是,如果你能继续使用生成器,这样你就不会在内存中构建庞大的列表。这可能需要更彻底的重构,这就是仅问题中的代码片段是不可能的。仅供参考:从晚到晚合并,但欢迎更晚到达的人,t这三个都在load\u data\u wrapper()
中。他们正在谈论本教程:这看起来是更好的选择,因为它解决了使用zip()时出现的问题