programing

유형 오류: 'zip' 개체를 구독할 수 없습니다.

closeapi 2023. 5. 6. 15:00
반응형

유형 오류: 'zip' 개체를 구독할 수 없습니다.

token/tag 형식의 태그가 있는 파일이 있고 (word, tag) 목록에서 단어가 있는 튜플을 반환하는 함수를 사용해 봅니다.

def text_from_tagged_ngram(ngram): 
    if type(ngram) == tuple:
        return ngram[0]
    return " ".join(zip(*ngram)[0]) # zip(*ngram)[0] returns a tuple with words from a (word,tag) list

python 2.7에서는 잘 작동했지만, python 3.4에서는 마지막 줄에 다음과 같은 오류를 제공합니다.TypeError: 'zip' object is not subscriptable왜 작동을 멈췄습니까?이걸 어떻게 고칠 수 있을까요?


Python 2에서 Python 3으로 병렬로 변경된 다른 몇 가지 사항은 Python 3에서 필터, 매핑축소 사용 방법을 참조하십시오.

Python 2에서 목록을 반환했습니다.Python 3에서 반복 가능한 개체를 반환합니다.그러나 다음과 같이 호출하는 것만으로 목록으로 만들 수 있습니다.

list(zip(...))

이 경우 다음과 같습니다.

list(zip(*ngram))

목록을 사용하여 인덱싱을 사용할 수 있습니다.

items = list(zip(*ngram))
...
items[0]

기타.

그러나 첫 번째 요소만 필요한 경우에는 목록이 엄격하게 필요하지 않습니다.당신은 그냥 사용할 수 있어요.

이 경우 다음과 같습니다.

next(zip(*ngram))

3.x에서는 목록이 아닌 특수 유형의 반복기를 반환합니다.설명서는 다음을 설명합니다.

zip()게으름:반복 가능한 항목이 반복될 때까지 요소는 처리되지 않습니다. 예를 들어 for 루프를 사용하거나 for 루프로 감싸거나list.

이는 인덱스를 작성할 수 없으므로 오래된 코드가 다음의 결과를 인덱싱하거나 슬라이스하려고 시도한다는 것을 의미합니다.zip실패하고 실패합니다.TypeError단순히 결과를 전달하는 것.list는 목록을 생성하며, 2.x에서와 같이 사용할 수 있습니다.

또한 결과에 대해 반복하면 요소를 찾을 수 없습니다.따라서 데이터를 다시 사용해야 하는 경우 목록을 한 번 만들고 목록을 다시 사용하면 빈 목록이 만들어집니다.

>>> example = zip('flying', 'circus')
>>> list(example)
[('f', 'c'), ('l', 'i'), ('y', 'r'), ('i', 'c'), ('n', 'u'), ('g', 's')]
>>> list(example)
[]

이 반복기는 클래스의 인스턴스로 구현됩니다...

>>> example = zip('flying', 'circus')
>>> example
<zip object at 0x7f76d8365540>
>>> type(example)
<class 'zip'>
>>> type(zip)
<class 'type'>

다음과 같이 기본 제공:

>>> class example(int, zip): pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: multiple bases have instance lay-out conflict
>>> # and that isn't caused by __slots__ either:
>>> zip.__slots__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'zip' has no attribute '__slots__'

(참고:유형 오류: 여러 베이스에 인스턴스 레이아웃 충돌이 있습니다. __slots__?를 정의하는 여러 클래스에서 상속할 수 없습니다.

이것의 주요 장점은 메모리를 절약하고 입력이 게으를 때 단락을 허용한다는 것입니다.예를 들어, 두 개의 큰 입력 텍스트 파일의 해당 행은 다음과 같습니다.zip전체 파일을 메모리에 읽지 않고 함께 페딩하고 반복합니다.

with open('foo.txt') as f, open('bar.txt') as g:
    for foo_line, bar_line in zip(f, g):
        print(f'{foo_line:.38} {bar_line:.38}')
        if foo_line == bar_line:
            print('^ found the first match ^'.center(78))
            break

언급URL : https://stackoverflow.com/questions/27431390/typeerror-zip-object-is-not-subscriptable

반응형