TypeError: 'zip' object is not subscriptable 类型错误:'zip' 对象不可索引

7 浏览
0 Comments

TypeError: 'zip' object is not subscriptable 类型错误:'zip' 对象不可索引

我有一个格式为token/tag的标记文件,并尝试使用一个函数返回一个由(word,tag)列表中的单词组成的元组。\n

def text_from_tagged_ngram(ngram): 
    if type(ngram) == tuple:
        return ngram[0]
    return " ".join(zip(*ngram)[0]) # zip(*ngram)[0]返回一个由(word,tag)列表中的单词组成的元组

\n在Python 2.7中,这个函数运行良好,但在Python 3.4中,最后一行出现错误,错误信息为TypeError: \'zip\' object is not subscriptable。\n为什么它停止工作了?我该如何解决这个问题?\n


\n在Python 2和Python 3中,还有其他一些事情发生了类似的变化;参见How to use filter, map, and reduce in Python 3

0
0 Comments

在Python 3.x版本中,zip函数返回一个特殊类型的迭代器,而不是一个列表。官方文档解释了这个问题的原因:zip()函数是惰性的,元素只有在迭代时才会被处理,比如通过for循环迭代或者使用list进行包装。

这意味着它不能被索引,所以旧的代码如果尝试对zip函数的结果进行索引或切片操作,就会出现TypeError错误。只需将结果传递给list函数,就会得到一个列表,可以像在Python 2.x中一样使用。

另外,这还意味着多次迭代zip函数的结果将无法找到任何元素。因此,如果需要重复使用数据,请创建一个列表并重复使用该列表,再次尝试创建列表将会得到一个空列表。

这个迭代器是作为一个内置类实现的。在上述代码中可以看到,zip函数的返回结果是一个zip类的实例对象。这个内置类还有其他特点,比如它不能继承自多个类,以及它没有__slots__属性。

使用这种迭代器的主要优点是可以节省内存,并且当输入也是惰性的时候可以进行短路操作。例如,可以将两个大型输入文本文件的相应行zip在一起并进行迭代,而无需将整个文件读入内存。

解决TypeError: 'zip' object is not subscriptable错误的方法是将zip函数的结果转换为列表(使用list函数)。这样就可以像在Python 2.x中一样进行索引和切片操作了。

示例代码如下:

example = zip('flying', 'circus')
result = list(example)
print(result)

以上是关于TypeError: 'zip' object is not subscriptable错误的原因和解决方法的整理。通过将zip函数的结果转换为列表,我们可以解决这个错误,并继续使用索引和切片操作。同时,我们了解到了zip函数返回的是一个特殊类型的迭代器,而不是列表,这使得它在节省内存和处理惰性输入方面具有优势。

0
0 Comments

在Python 2中,zip函数返回一个列表。但是在Python 3中,zip函数返回一个可迭代对象。如果想要将其转换为列表,只需要调用list函数。例如:list(zip(...))。在这个例子中,可以使用list(zip(*ngram))ngram转换为列表。使用列表后,可以使用索引操作来访问元素:items = list(zip(*ngram)),然后可以通过items[0]来获取第一个元素等。然而,如果只需要第一个元素,也可以直接使用next函数。例如:next(zip(*ngram))

(TypeError: 'zip' object is not subscriptable)这个错误的出现是因为zip函数返回的是一个可迭代对象,而不是一个列表。可迭代对象不支持使用索引来访问元素,因此会出现这个错误。

要解决这个问题,有两种方法:

1. 将可迭代对象转换为列表。可以使用list函数将zip函数返回的可迭代对象转换为列表。例如:list(zip(*ngram))

2. 只需要第一个元素时,可以使用next函数来获取。例如:next(zip(*ngram))

通过使用以上两种方法,就可以解决(TypeError: 'zip' object is not subscriptable)这个错误。

0