【问题标题】:Python 2 --> 3: object of type 'zip' has no len()Python 2 --> 3: 'zip' 类型的对象没有 len()
【发布时间】:2015-09-09 18:35:26
【问题描述】:

我正在关注神经网络的教程1

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

if test_data: n_test = len(test_data)

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

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

【问题讨论】:

  • 如果您可以访问已压缩的两个迭代,只需计算两者的长度并取较小的那个。拉链的长度不会有任何不同。
  • 尝试使用list(zip(...),你有zip(...)
  • 同样的问题,程序正在尝试执行类似zip(...)[i] 的操作。最好是定义一个新变量new_var = list(zip(...)) 并将zip(...) 替换为new_var

标签: python-2.7 python-3.x


【解决方案1】:

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

然后它起作用了。

【讨论】:

【解决方案2】:

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

#NOTE: `sum()` consumes the iterator
n_test = sum(1 for _ in test_data) # find len(iterator)

或者,如果您知道 test_data 总是很小 并且分析器说代码是您应用程序中的瓶颈,那么这里的代码可能对较小的 n_test 更有效: p>

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

【讨论】:

  • 您应该在检查if 之前执行test_data = list(test_data),否则if test_data 将始终为真,即使是空的zip。还可能值得指出sum(...) 将消耗zip
  • 我明白你的意思...事实上,如果 if 只是一个空列表,则不需要检查(那么 n_test 将只是 0)。不过,可能值得指出,以防万一。
  • 现在正在处理您的建议,非常感谢。这是别人的代码,我承认它在扩展我的能力。干杯!
【解决方案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))):
    

    【讨论】:

    • 如果您可以继续使用生成器,则性能更好,这样您就不会在内存中构建庞大的列表。这可能需要更彻底的重构,而仅使用问题中的代码片段是不可能的。
    【解决方案5】:

    在 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)
    

    【讨论】:

    • 这看起来是更好的选择,因为它解决了使用 zip() 产生的问题
    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 2015-01-21
    • 2021-03-03
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多