유형 오류: '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
'programing' 카테고리의 다른 글
WPF 그리드에서 하위 컨트롤 사이의 간격 (0) | 2023.05.06 |
---|---|
다른 모든 컨트롤보다 오버레이 컨트롤을 우선시하는 방법은 무엇입니까? (0) | 2023.05.06 |
Postgre를 삭제할 수 없습니다.SQL 역할입니다.오류: "일부 개체가 종속되어 있으므로 삭제할 수 없습니다." (0) | 2023.05.06 |
'of' 속성이 '관찰 가능한 유형' 유형에 없습니다. (0) | 2023.05.06 |
윈도우즈용 명령줄 svn? (0) | 2023.05.06 |