TypeError: 'zip' object is not subscriptable 类型错误:'zip' 对象不可索引
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。
在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
函数返回的是一个特殊类型的迭代器,而不是列表,这使得它在节省内存和处理惰性输入方面具有优势。
在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)这个错误。