Python에서 두 목록을 어떻게 연결합니까?
예시:
listone = [1, 2, 3] listtwo = [4, 5, 6]
예상되는 결과:
>>> joinedlist [1, 2, 3, 4, 5, 6]
질문자 :y2k
Python에서 두 목록을 어떻게 연결합니까?
예시:
listone = [1, 2, 3] listtwo = [4, 5, 6]
예상되는 결과:
>>> joinedlist [1, 2, 3, 4, 5, 6]
+
연산자를 사용하여 결합할 수 있습니다.
listone = [1,2,3] listtwo = [4,5,6] joinedlist = listone + listtwo
산출:
>>> joinedlist [1,2,3,4,5,6]
파이썬 >= 3.5
대안: [*l1, *l2]
언급할 가치가 있는 PEP 448
의 승인을 통해 또 다른 대안이 도입되었습니다.
추가 풀기 일반화(Additional Unpacking Generalizations) 라는 제목의 PEP는 일반적으로 Python에서 *
표현식을 사용할 때 일부 구문 제한을 줄였습니다. 그것으로 두 목록을 결합(모든 iterable에 적용됨)할 수도 있습니다.
>>> l1 = [1, 2, 3] >>> l2 = [4, 5, 6] >>> joined_list = [*l1, *l2] # unpack both iterables in a list literal >>> print(joined_list) [1, 2, 3, 4, 5, 6]
이 기능 3.5
용으로 정의 3.x
제품군의 이전 버전으로 백포트되지 않았습니다. 지원되지 않는 버전에서는 SyntaxError
가 발생합니다.
다른 접근 방식과 마찬가지로 이 방법도 해당 목록에 있는 요소의 얕은 복사본으로 생성됩니다.
이 방법의 거꾸로 당신이 정말로 그것을 수행하기 위해, 반복 가능 할 것입니다 아무것도하지 않아도 목록을 할 것입니다. PEP에 명시된 바와 같이:
이것은 또한 이제
[*my_list, *my_tuple, *my_range]
my_list + list(my_tuple) + list(my_range)
와 같이 반복 가능한 항목을 목록으로 합산하는 더 읽기 쉬운 방법으로 유용합니다.
+
를 추가하면 유형 불일치로 인해 TypeError
l = [1, 2, 3] r = range(4, 7) res = l + r
다음은 수행되지 않습니다.
res = [*l, *r]
먼저 iterable의 내용을 풀고 내용에서 list
을 만들기만 하면 되기 때문입니다.
itertools.chain()
사용하여 두 목록의 항목을 단순히 반복하는 생성기를 만드는 것도 가능합니다. 이를 통해 항목을 새 목록에 복사하지 않고 처리를 위해 목록(또는 반복 가능한 모든 항목)을 함께 연결할 수 있습니다.
import itertools for item in itertools.chain(listone, listtwo): # Do something with each list item
집합을 사용하여 고유 값의 병합된 목록을 얻을 수 있습니다.
mergedlist = list(set(listone + listtwo))
list.extend()
메서드를 list
의 끝에 목록을 추가할 수도 있습니다.
listone = [1,2,3] listtwo = [4,5,6] listone.extend(listtwo)
원래 목록을 그대로 유지하려면 새 list
개체를 만들고 두 목록을 모두 extend
mergedlist = [] mergedlist.extend(listone) mergedlist.extend(listtwo)
Python에서 두 목록을 어떻게 연결합니까?
3.9부터 이들은 파이썬에서 두 개(또는 그 이상) 목록을 연결하는 가장 인기 있는 stdlib 방법입니다.
각주
이것은 간결함 때문에 매끄러운 솔루션입니다. 그러나
sum
은 쌍으로 연결을 수행합니다. 즉, 각 단계에 대해 메모리를 할당해야 하므로 이 연산이 2차 연산입니다. 목록이 큰 경우 사용하지 마십시오.문서에서
chain
및chain.from_iterable
을 참조하십시오.import itertools
를 가져와야 합니다. 연결은 메모리에서 선형이므로 성능 및 버전 호환성 면에서 최고입니다.chain.from_iterable
은 2.6에서 도입되었습니다.이 방법은 추가 풀기 일반화(PEP 448) 를 사용하지만 수동으로 각 목록의 압축을 풀지 않는 한 N 목록으로 일반화할 수 없습니다.
a += b
와a.extend(b)
는 모든 실용적인 목적에서 거의 동등합니다.+=
목록에서 호출되면 내부적으로list.__iadd__
호출하여 첫 번째 목록을 두 번째 목록으로 확장합니다.
2-목록 연결 1
이 방법들 사이에는 큰 차이가 없지만 모두 동일한 복잡성(선형) 순서를 갖는다는 점을 감안할 때 의미가 있습니다. 스타일 문제 외에는 다른 것을 선호하는 특별한 이유가 없습니다.
N-리스트 연결
플롯은 perfplot 모듈을 사용하여 생성되었습니다. 참조용 코드입니다.
1. iadd
( +=
) 및 extend
메서드는 제자리에서 작동하므로 테스트하기 전에 매번 복사본을 생성해야 합니다. 공정하게 유지하기 위해 모든 메서드에는 무시할 수 있는 왼쪽 목록에 대한 사전 복사 단계가 있습니다.
list.__add__
를 어떤 방식, 형태 또는 형태로든 직접 사용하지 마십시오. 사실, dunder 메서드를 피하고 연산자와 operator
기능을 설계된 대로 사용하십시오. Python은 dunder를 직접 호출하는 것보다 더 복잡한 신중한 의미 체계를 가지고 있습니다. 여기 에 예가 있습니다. 요약하자면, a.__add__(b)
=> BAD; a + b
=> 좋습니다.
여기에 있는 일부 답변은 쌍 연결에 대해 reduce(operator.add, [a, b])
sum([a, b], [])
하지만 더 많은 단어입니다.
set
을 사용하는 모든 메서드는 중복을 삭제하고 순서를 잃게 됩니다. 주의해서 사용하십시오.
for i in b: a.append(i)
a.extend(b)
보다 더 장황하고 느립니다. 이는 단일 함수 호출이며 더 관용적입니다. append
는 목록에 대해 메모리가 할당되고 확장되는 의미 체계 때문에 더 느립니다. 유사한 토론은 여기를 참조하십시오.
heapq.merge
가 작동하지만 그 사용 사례는 선형 시간에 정렬된 목록을 병합하는 것입니다. 다른 상황에서 사용하는 것은 안티 패턴입니다.
yield
하는 것은 허용되는 방법이지만 chain
은 이를 더 빠르고 더 잘 수행합니다(C에 코드 경로가 있으므로 빠릅니다).
operator.add(a, b)
a + b
와 동등한 허용 가능한 기능입니다. 사용 사례는 주로 동적 메서드 디스패치에 대한 것입니다. 그렇지 않으면 내 의견으로 는 더 짧고 읽기 쉬운 a + b
를 선호합니다. YMMV.
이것은 매우 간단하며 자습서 에서도 표시되었다고 생각합니다.
>>> listone = [1,2,3] >>> listtwo = [4,5,6] >>> >>> listone + listtwo [1, 2, 3, 4, 5, 6]
이 질문은 두 목록을 결합하는 것에 대해 직접 묻습니다. 그러나 많은 목록을 결합하는 방법을 찾고 있는 경우에도 검색에서 꽤 높습니다(0개의 목록을 결합하는 경우 포함).
가장 좋은 방법은 목록 이해를 사용하는 것입니다.
>>> a = [[1,2,3], [4,5,6], [7,8,9]] >>> [x for xs in a for x in xs] [1, 2, 3, 4, 5, 6, 7, 8, 9]
다음과 같이 생성기를 만들 수도 있습니다.
>>> map(str, (x for xs in a for x in xs)) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
이전 답변
보다 일반적인 접근 방식을 고려하십시오.
a = [[1,2,3], [4,5,6], [7,8,9]] reduce(lambda c, x: c + x, a, [])
출력합니다:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
a
가 []
또는 [[1,2,3]]
일 때도 올바르게 작동합니다.
itertools
하면 더 효율적으로 수행할 수 있습니다.
a = [[1,2,3], [4,5,6], [7,8,9]] list(itertools.chain(*a))
list
가 필요하지 않고 iterable만 list()
생략하십시오.
업데이트
댓글에서 Patrick Collins가 제안한 대안도 도움이 될 수 있습니다.
sum(a, [])
다음과 같이 +
또는 +=
연산자를 간단히 사용할 수 있습니다.
a = [1, 2, 3] b = [4, 5, 6] c = a + b
또는:
c = [] a = [1, 2, 3] b = [4, 5, 6] c += (a + b)
또한 병합된 목록의 값을 고유하게 하려면 다음을 수행할 수 있습니다.
c = list(set(a + b))
itertools.chain
함수는 다양한 수의 인수를 허용한다는 점에 주목할 가치가 있습니다.
>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f'] >>> [i for i in itertools.chain(l1, l2)] ['a', 'b', 'c'] >>> [i for i in itertools.chain(l1, l2, l3)] ['a', 'b', 'c', 'd', 'e', 'f']
iterable(튜플, 목록, 생성기 등)이 입력이면 from_iterable
클래스 메서드를 사용할 수 있습니다.
>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']] >>> [i for i in itertools.chain.from_iterable(il)] ['a', 'b', 'c', 'd', 'e', 'f']
Python 3.3 이상에서는 다음 에서 yield를 사용할 수 있습니다.
listone = [1,2,3] listtwo = [4,5,6] def merge(l1, l2): yield from l1 yield from l2 >>> list(merge(listone, listtwo)) [1, 2, 3, 4, 5, 6]
또는 임의의 수의 반복자를 지원하려면 다음을 수행하십시오.
def merge(*iters): for it in iters: yield from it >>> list(merge(listone, listtwo, 'abcd', [20, 21, 22])) [1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]
두 목록을 정렬된 형태로 merge
heapq
라이브러리의 병합 기능을 사용할 수 있습니다.
from heapq import merge a = [1, 2, 4] b = [2, 4, 6, 7] print list(merge(a, b))
목록 수가 적은 경우 목록을 함께 추가하거나 내부 압축 풀기를 사용할 수 있습니다(Python-3.5 이상에서 사용 가능):
In [1]: listone = [1, 2, 3] ...: listtwo = [4, 5, 6] In [2]: listone + listtwo Out[2]: [1, 2, 3, 4, 5, 6] In [3]: [*listone, *listtwo] Out[3]: [1, 2, 3, 4, 5, 6]
목록 수가 더 많은 경우에 대한 보다 일반적인 방법으로 파이썬 접근 방식 itertoold
모듈 chain.from_iterable()
1 함수를 사용할 수 있습니다. 또한 이 답변을 기반으로이 기능이 최고입니다. 또는 적어도 중첩 목록을 평평하게 만드는 아주 간단한 방법입니다.
>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> import itertools >>> list(itertools.chain.from_iterable(l)) [1, 2, 3, 4, 5, 6, 7, 8, 9]
+
)를 사용할 수 없는 경우 operator
가져오기를 사용할 수 있습니다.
import operator listone = [1,2,3] listtwo = [4,5,6] result = operator.add(listone, listtwo) print(result) >>> [1, 2, 3, 4, 5, 6]
__add__
dunder 함수를 사용할 수도 있습니다.
listone = [1,2,3] listtwo = [4,5,6] result = list.__add__(listone, listtwo) print(result) >>> [1, 2, 3, 4, 5, 6]
복잡한 정렬 규칙으로 두 개의 정렬된 목록을 병합해야 하는 경우 다음 코드와 같이 직접 롤링해야 할 수 있습니다(가독성을 위해 간단한 정렬 규칙 사용 :-)).
list1 = [1,2,5] list2 = [2,3,4] newlist = [] while list1 and list2: if list1[0] == list2[0]: newlist.append(list1.pop(0)) list2.pop(0) elif list1[0] < list2[0]: newlist.append(list1.pop(0)) else: newlist.append(list2.pop(0)) if list1: newlist.extend(list1) if list2: newlist.extend(list2) assert(newlist == [1, 2, 3, 4, 5])
NumPy를 사용하는 경우 다음 명령으로 호환되는 차원의 두 배열을 연결할 수 있습니다.
numpy.concatenate([a,b])
간단한 목록 이해를 사용하십시오.
joined_list = [item for list_ in [list_one, list_two] for item in list_]
추가 풀기 일반화 를 사용하는 최신 접근 방식의 모든 이점이 있습니다. 즉, 임의의 수의 다른 반복 가능 항목(예: 목록, 튜플, 범위 및 생성기)을 연결할 수 있으며 Python 3.5 이상에 국한되지 않습니다. .
list
객체에 정의된 append()
메서드를 사용할 수 있습니다.
mergedlist =[] for elem in listone: mergedlist.append(elem) for elem in listtwo: mergedlist.append(elem)
list(set(listone) | set(listtwo))
위의 코드는 순서를 유지하지 않고 각 목록에서 중복을 제거합니다(연결된 목록에서는 제외)
또 다른 방법:
>>> listone = [1, 2, 3] >>> listtwo = [4, 5, 6] >>> joinedlist = [*listone, *listtwo] >>> joinedlist [1, 2, 3, 4, 5, 6] >>>
많은 사람들이 이미 지적했듯이 itertools.chain()
은 두 목록에 정확히 동일한 처리 를 적용해야 하는 경우 갈 수 있는 방법입니다. 제 경우에는 레이블과 플래그가 목록마다 다르기 때문에 조금 더 복잡한 것이 필요했습니다. 결과적으로 itertools.chain()
배후에서 단순히 다음을 수행합니다.
for it in iterables: for element in it: yield element
( https://docs.python.org/2/library/itertools.html 참조 ), 그래서 여기에서 영감을 받아 다음 라인을 따라 글을 썼습니다.
for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')): print header + ':' for path in iterable: [...] command = 'cp -r' if os.path.isdir(srcPath) else 'cp' print >> SCRIPT , command, flag, srcPath, mergedDirPath [...]
여기서 이해해야 할 요점은 목록이 다른 것과 같은 객체인 iterable의 특별한 경우일 뿐이라는 것입니다. for ... in
루프는 튜플 변수와 함께 작동할 수 있으므로 동시에 여러 변수를 루프하는 것이 간단합니다.
목록 목록을 결합하는 정말 간결한 방법은
list_of_lists = [[1,2,3], [4,5,6], [7,8,9]] reduce(list.__add__, list_of_lists)
우리에게 주는
[1, 2, 3, 4, 5, 6, 7, 8, 9]
그래서 두 가지 쉬운 방법이 있습니다.
+
사용 : 제공된 목록에서 새 목록을 만듭니다.예시:
In [1]: a = [1, 2, 3] In [2]: b = [4, 5, 6] In [3]: a + b Out[3]: [1, 2, 3, 4, 5, 6] In [4]: %timeit a + b 10000000 loops, best of 3: 126 ns per loop
예시:
In [1]: a = [1, 2, 3] In [2]: b = [4, 5, 6] In [3]: %timeit a.extend(b) 10000000 loops, best of 3: 91.1 ns per loop
따라서 가장 널리 사용되는 두 가지 방법 중에서 extend
이 효율적임을 알 수 있습니다.
.extend
메서드를 사용할 수 있습니다.
listone = [1, 2, 3] listtwo = [4, 5, 6] listone.extend(lsittwo)
이제 할 때,
print(listone)
당신은 이 목록을 갖게 될 것입니다.
[1,2,3,4,5,6]
a=[1,2,3] b=[4,5,6] c=a+b print(c)
산출:
>>> [1, 2, 3, 4, 5, 6]
위의 코드에서 "+" 연산자는 2개의 목록을 단일 목록으로 연결하는 데 사용됩니다.
또 다른 솔루션:
a=[1,2,3] b=[4,5,6] c=[] #Empty list in which we are going to append the values of list (a) and (b) for i in a: c.append(i) for j in b: c.append(j) print(c)
산출:
>>> [1, 2, 3, 4, 5, 6]
sum
만 사용할 수도 있습니다.
>>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> sum([a, b], []) [1, 2, 3, 4, 5, 6] >>>
이것은 모든 길이와 모든 요소 유형의 목록에서 작동합니다.
>>> a = ['a', 'b', 'c', 'd'] >>> b = [1, 2, 3, 4] >>> c = [1, 2] >>> sum([a, b, c], []) ['a', 'b', 'c', 'd', 1, 2, 3, 4, 1, 2] >>>
[]
추가하는 이유는 start
인수가 0
으로 설정되어 있으므로 목록을 반복하고 start
추가하지만 0 + [1, 2, 3]
은 오류를 발생하므로 설정하면 start
에 []
, 그것은에 추가합니다 []
, [] + [1, 2, 3]
예상대로 작동합니다.
나는 당신이 두 가지 방법 중 하나를 원한다고 가정합니다.
중복 요소 유지
매우 쉽습니다. 문자열처럼 연결하면 됩니다.
def concat_list(l1,l2): l3 = l1+l2 return l3
다음으로 중복 요소를 제거하려면
def concat_list(l1,l2): l3 = [] for i in [l1,l2]: for j in i: if j not in l3: #Check if element exists in final list, if no then add element to list l3.append(j) return l3
이 두 목록을 추가하십시오 //
최종 목록=목록1 + 목록2
import itertools A = list(zip([1,3,5,7,9],[2,4,6,8,10])) B = [1,3,5,7,9]+[2,4,6,8,10] C = list(set([1,3,5,7,9] + [2,4,6,8,10])) D = [1,3,5,7,9] D.append([2,4,6,8,10]) E = [1,3,5,7,9] E.extend([2,4,6,8,10]) F = [] for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]): F.append(a) print ("A: " + str(A)) print ("B: " + str(B)) print ("C: " + str(C)) print ("D: " + str(D)) print ("E: " + str(E)) print ("F: " + str(F))
산출:
A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)] B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]] E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
파이썬에서 union() 함수를 사용할 수 있습니다.
joinedlist = union(listone, listtwo) print(joinedlist)
기본적으로 이것이 하는 일은 두 목록에서 모든 중복 항목 중 하나를 제거하는 것입니다. 목록에 중복 항목이 없기 때문에 두 목록의 연결된 버전만 반환합니다.
출처 : http:www.stackoverflow.com/questions/1720421/how-do-i-concatenate-two-lists-in-python
Bash에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법 (0) | 2021.11.05 |
---|---|
"git add -A"와 "git add"의 차이점 (0) | 2021.11.05 |
커밋의 모든 파일을 어떻게 나열합니까? (0) | 2021.11.05 |
한 줄에 여러 예외 잡기(블록 제외) (0) | 2021.11.05 |
대소문자를 구분하지 않는 'Contains(string)' (0) | 2021.11.05 |