파이썬에서 어떤 유형의 이터 러블 /리스트가 이전 이터 러블 / 목록의 동일한 항목을 구조적으로 공유 할 수 있습니까?

Viyps

두 개의 긴 목록이 a있고 목록이 필요하다고 가정 b합니다 c.

a = [obj1, obj2, ..., objN]
b = [objNplus1, objNplus2, ..., objNplusM]
c = a + b

이전 목록을 시작과 끝으로 공유하지만 참조 무결성을 위반하지 않고, 즉 변경 a하거나 변경 하지 않고 새 목록을 만들려면 어떻게해야합니까 b? 또한 c처음부터 전체 목록 을 다시 만들지 않고 ? 기본 컬렉션의 일부 또는 외부 패키지의 일부로 이러한 목록과 유사한 것이 있습니까?

나는 그것이 아마도 DFS를 모방하는 연결된 연결 목록과 함께 나무와 같은 것이라고 생각합니다.

셀주크

다음을 사용할 수 있습니다 itertools.chain().

소진 될 때까지 첫 번째 이터 러블에서 요소를 반환하는 이터 러블을 만든 다음 모든 이터 러블이 소진 될 때까지 다음 이터 러블로 진행합니다. 연속 된 시퀀스를 단일 시퀀스로 처리하는 데 사용됩니다.

예를 들면 :

import itertools
c = itertools.chain(a, b)

업데이트 :보다 밀접하게 에뮬레이트하려면 다음과 list같이 자신 만의 클래스를 작성할 수 있습니다.

class ListOfLists():
    def __init__(self, *args):
        self._lists = args
        self._len = sum(map(len, self._lists))

    def __iter__(self):
        for _list in self._lists:
            for item in _list:
                yield item

    def __getitem__(self, y):
        if y >= self._len:
            raise IndexError
        for l in self._lists:
            if y > len(l):
                y -= len(l)
            else:
                return l[y]

    def __len__(self):
        return self._len

a = [1, 2, 3]
b = ["a", "b", "c"]
c = ListOfLists(a, b)

print("Total length is", len(c))
print("4th element is", c[4])
for i, item in enumerate(c):
    print(i, ":", item)

산출:

Total length is 6
4th element is b
0 : 1
1 : 2
2 : 3
3 : a
4 : b
5 : c

다른 방법 (예 : __getslice__()슬라이싱이 필요한 경우)도 구현 해야합니다. 또한 재귀 적이 지 않으므로 list기존 형식의 "일반"만 병합 할 수 있습니다 . ListOfLists를 생성자에 전달하면 작동하지 않습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관