복붙노트

[PYTHON] 파이썬에서 같은 길이의 여러리스트끼리 끼워 넣기

PYTHON

파이썬에서 같은 길이의 여러리스트끼리 끼워 넣기

파이썬에서는 동일한 길이의 두리스트를 인터리브하는 좋은 방법이 있습니까?

내가 [1,2,3]과 [10,20,30]을 받았습니다. 저는 그것들을 [1,10,2,20,3,30]으로 변형시키고 싶습니다.

해결법

  1. ==============================

    1.질문을 게시 한 후 다음과 같이 간단하게 수행 할 수 있음을 깨달았습니다.

    질문을 게시 한 후 다음과 같이 간단하게 수행 할 수 있음을 깨달았습니다.

    [val for pair in zip(l1, l2) for val in pair]
    

    여기서 l1과 l2는 두리스트입니다.

    인터리빙 할 N 개의리스트가 있다면,

    lists = [l1, l2, ...]
    [val for tup in zip(*lists) for val in tup]
    

    더 많은 요리법을 보려면 접미사 값으로 목록을 끼워 넣는 가장 좋은 방법을 따르십시오. 거기에서 시연 된 방법 중 일부는 동일한 길이의 두 개 이상의 목록으로 일반화 될 수 있습니다.

  2. ==============================

    2.파이썬> = 2.3 인 경우 슬라이스 구문이 확장되었습니다.

    파이썬> = 2.3 인 경우 슬라이스 구문이 확장되었습니다.

    >>> a = [0, 2, 4, 6, 8]
    >>> b = [1, 3, 5, 7, 9]
    >>> c = a + b
    >>> c[::2] = a
    >>> c[1::2] = b
    >>> c
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    c = a + b 줄은 정확한 길이의 새로운 목록을 만드는 간단한 방법으로 사용됩니다 (이 단계에서는 내용이 중요하지 않습니다). 다음 두 라인은 a와 b를 인터리빙하는 실제 작업을 수행합니다. 첫 번째 것은 a의 요소를 c의 모든 짝수 인덱스에 할당합니다. 두 번째 요소는 b의 요소를 c의 모든 홀수 인덱스에 할당합니다.

  3. ==============================

    3.주어진

    주어진

    a = [1, 2, 3]
    b = [10, 20, 30]
    c = [10, 20, 30, 99]
    

    암호

    동일한 길이의 목록을 가정하면 itertools.chain 및 zip으로 인터리브 된 목록을 가져올 수 있습니다.

    import itertools
    
    
    list(itertools.chain(*zip(a, b)))
    # [1, 10, 2, 20, 3, 30]
    

    대안

    itertools.zip_longest

    일반적으로 불일치 목록을 사용하는 경우 zip_longest를 사용합니다 (권장).

    [x for x in itertools.chain(*itertools.zip_longest(a, c)) if x is not None]
    # [1, 100, 2, 200, 3, 300, 999]
    

    많은 목록을 안전하게 삽입 할 수 있습니다.

    [x for x in itertools.chain(*itertools.zip_longest(a, b, c)) if x is not None]
    # [1, 10, 100, 2, 20, 200, 3, 30, 300, 999]
    

    more_itertools +

    roundrobin itertools recipe, interleave 및 interleave_longest와 함께 제공되는 라이브러리입니다.

    import more_itertools
    
    
    list(more_itertools.roundrobin(a, b))
    # [1, 10, 2, 20, 3, 30]
    
    list(more_itertools.interleave(a, b))
    # [1, 10, 2, 20, 3, 30]
    
    list(more_itertools.interleave_longest(a, c))
    # [1, 100, 2, 200, 3, 300, 999]
    

    ~로부터의 수익률

    마지막으로, Python 3에서 흥미로운 부분이 있지만 (권장하지는 않지만) :

    list(filter(None, ((yield from x) for x in zip(a, b))))
    # [1, 10, 2, 20, 3, 30]
    
    list([(yield from x) for x in zip(a, b)])
    # [1, 10, 2, 20, 3, 30]
    

    + via pip install more_itertools

  4. ==============================

    4.대안 :

    대안 :

    >>> l1=[1,2,3]
    >>> l2=[10,20,30]
    >>> [y for x in map(None,l1,l2) for y in x if y is not None]
    [1, 10, 2, 20, 3, 30]
    

    지도가 병렬로 목록에서 작동하기 때문에 작동합니다. 그것은 2.2에서 동일하게 작동합니다. 자체적으로 None은 호출 된 함수로 map은 튜플 목록을 생성합니다.

    >>> map(None,l1,l2,'abcd')
    [(1, 10, 'a'), (2, 20, 'b'), (3, 30, 'c'), (None, None, 'd')]
    

    그런 다음 튜플 목록을 평평하게 만듭니다.

    이점은지도가 원하는 수의 목록에 대해 작동하고 길이가 다른 경우에도 작동한다는 것입니다.

    >>> l1=[1,2,3]
    >>> l2=[10,20,30]
    >>> l3=[101,102,103,104]
    >>> [y for x in map(None,l1,l2,l3) for y in x if y in not None]
    [1, 10, 101, 2, 20, 102, 3, 30, 103, 104]
    
  5. ==============================

    5.나는 받아 들인 대답이 다루지 않는 다른 크기의 목록으로 이것을하는 방법이 필요했다.

    나는 받아 들인 대답이 다루지 않는 다른 크기의 목록으로 이것을하는 방법이 필요했다.

    내 솔루션은 발전기를 사용하고 있기 때문에 사용법이 조금 더 멋지게 보입니다.

    def interleave(l1, l2):
        iter1 = iter(l1)
        iter2 = iter(l2)
        while True:
            try:
                if iter1 != None:
                    yield next(iter1)
            except StopIteration:
                iter1 = None
            try:
                if iter2 != None:
                    yield next(iter2)
            except StopIteration:
                iter2 = None
            if iter1 == None and iter2 == None:
                raise StopIteration()
    

    그리고 그것의 사용법 :

    >>> a = [1, 2, 3, 4, 5]
    >>> b = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> list(interleave(a, b))
    [1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 'e', 'f', 'g']
    >>> list(interleave(b, a))
    ['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5, 'f', 'g']
    
  6. ==============================

    6.나는 aix의 솔루션이 가장 좋습니다. 2.2에서 작동해야한다고 생각하는 또 다른 방법은 다음과 같습니다.

    나는 aix의 솔루션이 가장 좋습니다. 2.2에서 작동해야한다고 생각하는 또 다른 방법은 다음과 같습니다.

    >>> x=range(3)
    >>> x
    [0, 1, 2]
    >>> y=range(7,10)
    >>> y
    [7, 8, 9]
    >>> sum(zip(x,y),[])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "tuple") to list
    >>> sum(map(list,zip(x,y)),[])
    [0, 7, 1, 8, 2, 9]
    

    하나 더 방법 :

    >>> a=[x,y]
    >>> [a[i][j] for j in range(3) for i in (0,1)]
    [0, 7, 1, 8, 2, 9]
    

    과:

    >>> sum((list(i) for i in zip(x,y)),[])
    [0, 7, 1, 8, 2, 9]
    
  7. ==============================

    7.

    [el for el in itertools.chain(*itertools.izip_longest([1,2,3], [4,5])) if el is not None]
    

    너가 지키고 싶지 않는 한 아무도 너를 지키고 싶지 않다.

  8. from https://stackoverflow.com/questions/7946798/interleave-multiple-lists-of-the-same-length-in-python by cc-by-sa and MIT license