[PYTHON] 파이썬에서 같은 길이의 여러리스트끼리 끼워 넣기
PYTHON파이썬에서 같은 길이의 여러리스트끼리 끼워 넣기
파이썬에서는 동일한 길이의 두리스트를 인터리브하는 좋은 방법이 있습니까?
내가 [1,2,3]과 [10,20,30]을 받았습니다. 저는 그것들을 [1,10,2,20,3,30]으로 변형시키고 싶습니다.
해결법
-
==============================
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.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.주어진
주어진
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.대안 :
대안 :
>>> 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.나는 받아 들인 대답이 다루지 않는 다른 크기의 목록으로 이것을하는 방법이 필요했다.
나는 받아 들인 대답이 다루지 않는 다른 크기의 목록으로 이것을하는 방법이 필요했다.
내 솔루션은 발전기를 사용하고 있기 때문에 사용법이 조금 더 멋지게 보입니다.
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.나는 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.
[el for el in itertools.chain(*itertools.izip_longest([1,2,3], [4,5])) if el is not None]
너가 지키고 싶지 않는 한 아무도 너를 지키고 싶지 않다.
from https://stackoverflow.com/questions/7946798/interleave-multiple-lists-of-the-same-length-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Tk treeview 열 정렬 (0) | 2018.11.10 |
---|---|
[PYTHON] Python 스크립트의 프로그램이 있는지 확인하십시오. (0) | 2018.11.10 |
[PYTHON] PyQt4 - 드래그 앤 드롭 (0) | 2018.11.10 |
[PYTHON] OpenCV + Python-2.7을 사용하여 전신 탐지 및 추적 (0) | 2018.11.10 |
[PYTHON] Python 이미지 라이브러리에 Base64 문자열로드하기 (0) | 2018.11.10 |