반복 가능한 객체의 모든 요소를 서로 조합하여 비교하고 싶습니다. 재현 가능한 다음 예제는 일반 목록의 기능을 모방 한 것이지만 내 문제를 보여줍니다. 이 예제에서는 [ "A", "B", "C", "D"] 목록을 가지고 다음과 같은 16 줄의 출력을 얻고 싶습니다. 각 항목의 모든 조합은 서로 다릅니다. 100 개의 항목 목록은 100 * 100 = 10,000 행을 생성해야합니다.동시에 하나의 python iterable을 통해 여러 iterator를 가질 수 있습니까?
A A True
A B False
A C False
... 10 more lines ...
D B False
D C False
D D True
다음 코드는 작업을 수행해야하는 것처럼 보입니다.
class C():
def __init__(self):
self.stuff = ["A","B","C","D"]
def __iter__(self):
self.idx = 0
return self
def __next__(self):
self.idx += 1
if self.idx > len(self.stuff):
raise StopIteration
else:
return self.stuff[self.idx - 1]
thing = C()
for x in thing:
for y in thing:
print(x, y, x==y)
그러나 Y-루프를 마친 후
는 X-루프는 그것은 단지 반복자의 첫 번째 항목을 사용하여, 비록도 다 보인다.A A True
A B False
A C False
A D False
많이 검색 한 후, 나는 결국, 다음 코드를 시도 itertools.tee 같은 데이터를 통해 나에게 두 개의 독립적 인 반복자를 허용 할 것으로 기대 :
import itertools
thing = C()
thing_one, thing_two = itertools.tee(thing)
for x in thing_one:
for y in thing_two:
print(x, y, x==y)
을하지만 이전과 같은 결과를 얻었다.
이 실제 개체는 다양한 수의 파일과 하위 디렉터리가 트리의 다양한 깊이에있는 디렉터리 및 파일 구조의 모델입니다. 이 예제와 마찬가지로 수천 개의 멤버에 대한 링크를 중첩하여 올바르게 반복합니다. 하지만 반복 작업을하기 전에 전체 복사본을 만들어야 할 경우 작업 부하를 두 배로 늘리는 비교를 위해 필요에 따라 즉석에서 많은 내부 개체 내에서 값 비싼 처리를 수행합니다. 가능한 한 모든 데이터가 포함 된 단일 개체를 가리키는 여러 개의 반복자를 사용하고 싶습니다. 답변에
편집 : 질문 코드의 중요한 결함은, 모든 대답에 지적 독립적으로 여러 발신자를 처리 할 수 없습니다되는 하나의 내부 self.idx 변수입니다. 받아 들인 대답은 내 실제 수업 (이 재현 가능한 예에서는 지나치게 단순화)에 가장 적합하며, 또 다른 대답은 여기에 제시된 목록과 같은 간단한 데이터 구조를위한 간단하고 우아한 해결책을 제시합니다.
그런 소스를 사용하여 iterables를 작성하도록 가르쳤다면 사용을 중지하십시오. – user2357112
개체를 인덱싱 할 수 있습니까? 그것은'__len__' 메소드를 가지고 있습니까? –
이것은 본질적으로 중첩 된 디렉토리와 파일 구조를 표현하기 때문에 여러 레벨에서 하나의 인덱스가 필요하지 않습니다. 그러나 노드의 전체 개수를 가지고 있으므로 쉽게 __len__을 작성할 수 있습니다. – mightypile