티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
How do I make a flat list out of a list of lists?
리스트 안에 리스트가 있을 때 펼쳐서 일반 리스트로 만드는 방법
문제 내용
I have a list of lists like [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
. How can I flatten it to get [1, 2, 3, 4, 5, 6, 7, 8, 9]
?
[1, 2, 3], [4, 5, 6], [7], [8, 9]와 같은 목록이 있습니다.
[1, 2, 3, 4, 5, 6, 7, 8, 9]를 얻으려면 어떻게 해야하나요?
If your list of lists comes from a nested list comprehension, the problem can be solved more simply/directly by fixing the comprehension; please see python list comprehensions; compressing a list of lists?.
만약 당신의 목록이 중첩된 목록 이해에서 나온다면, 문제는 이해를 수정함으로써 더 단순하고 직접적으로 해결될 수 있다; python 목록 이해; 목록 압축?을 참조하십시오.
The most popular solutions here generally only flatten one "level" of the nested list. See Flatten an irregular (arbitrarily nested) list of lists for solutions that completely flatten a deeply nested structure (recursively, in general).
여기서 가장 많이 사용되는 솔루션은 일반적으로 중첩된 목록의 "수준"을 하나만 평평하게 만듭니다. 깊이 중첩된 구조를 완전히 평탄화하는 솔루션에 대한 자세한 내용은 불규칙(임의 중첩) 리스트 평탄화를 참조하십시오(일반적으로 반복적으로).
높은 점수를 받은 Solution
Given a list of lists l
,
리스트 목록을 보면
flat_list = [item for sublist in l for item in sublist]
which means:
다음을 의미합니다.
flat_list = []
for sublist in l:
for item in sublist:
flat_list.append(item)
is faster than the shortcuts posted so far. (l
is the list to flatten.)
지금까지 게시된 바로 가기보다 빠릅니다. (l은 평평하게 할 목록입니다.)
Here is the corresponding function:
다음은 해당 기능입니다.
def flatten(l):
return [item for sublist in l for item in sublist]
As evidence, you can use the timeit
module in the standard library:
그 증거로 표준 라이브러리의 timeit 모듈을 사용할 수 있습니다.
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 1.1 msec per loop
Explanation: the shortcuts based on +
(including the implied use in sum
) are, of necessity, O(L**2)
when there are L sublists -- as the intermediate result list keeps getting longer, at each step a new intermediate result list object gets allocated, and all the items in the previous intermediate result must be copied over (as well as a few new ones added at the end). So, for simplicity and without actual loss of generality, say you have L sublists of I items each: the first I items are copied back and forth L-1 times, the second I items L-2 times, and so on; total number of copies is I times the sum of x for x from 1 to L excluded, i.e., I * (L**2)/2
.
설명: L개의 하위 목록이 있을 때 +(총의 묵시적 사용 포함)를 기반으로 하는 바로 가기는 O(L**2)입니다. 중간 결과 목록이 계속 길어지고 각 단계에서 새 중간 결과 목록 개체가 할당되며 이전 중간 결과의 모든 항목이 복사되어야 합니다(몇 개의 새 항목뿐만 아니라). 마지막에 추가됨) 따라서 단순성을 유지하고 일반성을 실질적으로 잃지 않으려면 첫 번째 I 항목이 L-1번 앞뒤로 복사되고, 두 번째 I 항목이 L-2번 복사되는 등 각 I 항목의 하위 목록이 있다고 가정합니다. 총 복사본 수는 x에 대한 합을 1에서 L까지 곱한 것입니다. 즉, I *(L**2)/2입니다.
The list comprehension just generates one list, once, and copies each item over (from its original place of residence to the result list) also exactly once.
목록 이해는 한 번만 목록을 생성하고 각 항목을 원래 거주지에서 결과 목록으로 정확히 한 번 복사합니다.
가장 최근 달린 Solution
Not a one-liner, but seeing all the answers here, I guess this long list missed some pattern matching, so here it is :)
원라이너는 아니지만, 여기 있는 모든 답변을 보니, 이 긴 목록이 패턴 매칭을 놓친 것 같아요, 그래서 여기 있어요 :)
The two methods are probably not efficient, but anyway, it's easy to read (to me at least; perhaps I'm spoiled by functional programming):
두 가지 방법은 아마도 효율적이지는 않지만 어쨌든 읽기는 쉽다.
def flat(x):
match x:
case []:
return []
case [[*sublist], *r]:
return [*sublist, *flat(r)]
The second version considers lists of lists of lists... whatever the nesting:
두 번째 버전은 목록 목록을 고려합니다. 네스팅이 무엇이든:
def flat(x):
match x:
case []:
return []
case [[*sublist], *r]:
return [*flat(sublist), *flat(r)]
case [h, *r]:
return [h, *flat(r)]
출처 : https://stackoverflow.com/questions/952914/how-do-i-make-a-flat-list-out-of-a-list-of-lists
'개발 > 파이썬' 카테고리의 다른 글
exception처럼 numpy 경고 받기 (0) | 2022.11.29 |
---|---|
Dictionary에 새 키를 추가하는 방법 (0) | 2022.11.29 |
Dictionary를 value로 정렬하려면 어떻게 해야 합니까? (0) | 2022.11.29 |
'for' 루프의 인덱스 접근 (0) | 2022.11.29 |
'for' 루프를 사용하여 Dictionary에서 반복하기 (0) | 2022.11.28 |