리스트에서 플랫리스트를 작성하려면 어떻게 해야 하나요?
이 목록 목록을 평평하게 만듭니다.
[[1, 2, 3], [4, 5, 6], [7], [8, 9]]
다음과 같이 입력합니다.
[1, 2, 3, 4, 5, 6, 7, 8, 9]
「」를 해 주세요.l
,
flat_list = [item for sublist in l for item in sublist]
즉, 다음과 같습니다.
flat_list = []
for sublist in l:
for item in sublist:
flat_list.append(item)
l
의
대응하는 기능은 다음과 같습니다.
def flatten(l):
return [item for sublist in l for item in sublist]
증거로 수 .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
설명: 숏컷의 베이스는 다음과 같습니다.+
)sum
으로 ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ),O(L**2)
L개의 서브리스트가 있는 경우 -- 중간 결과 리스트가 길어질수록 각 스텝에서 새로운 중간 결과 리스트 오브젝트가 할당되어 이전 중간 결과의 모든 아이템이 복사되어야 합니다(마지막에 추가된 몇 개의 새로운 아이템도 복사되어야 합니다., 각각 L개씩 첫되고, 두 뒤로 복사되고 두 번째 I 항목은 L-2번 복사됩니다. 총 복사본 수는 x의 합을 1에서 L까지 곱한 값입니다. 즉, 제외됩니다.I * (L**2)/2
.
목록 이해는 한 번만 목록을 생성하고 각 항목을 (원래 거주지에서 결과 목록으로) 정확하게 한 번 복사합니다.
다음을 사용할 수 있습니다.
>>> import itertools
>>> list2d = [[1,2,3], [4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain(*list2d))
또는 를 사용하여 목록을 압축 해제하지 않아도 됩니다.*
★★★★★★★★★★★★★★★★★★:
>>> import itertools
>>> list2d = [[1,2,3], [4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain.from_iterable(list2d))
더 것입니다.[item for sublist in l for item in sublist]
빠른 처럼 보입니다: 더 빠른 것 같습니다.
$ python3 -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;import itertools' 'list(itertools.chain.from_iterable(l))'
20000 loops, best of 5: 10.8 usec per loop
$ python3 -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 5: 21.7 usec per loop
$ python3 -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 5: 258 usec per loop
$ python3 -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;from functools import reduce' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 5: 292 usec per loop
$ python3 --version
Python 3.7.5rc1
작성자의 주의사항:이것은 매우 비효율적이다.하지만 재밌어요. 왜냐하면 모노이드는 멋져요
>>> xss = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> sum(xss, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
sum
할 수 있는 xss
[]
은 ( )입니다.0
(어느 쪽인가 하면)
하고 있기 에, 실제로는 「」를 취득됩니다.[1,3]+[2,4]
의 sum([[1,3],[2,4]],[])
은 '먹다'와 [1,3,2,4]
.
는 목록 목록에서만 작동합니다.목록 목록을 보려면 다른 솔루션이 필요합니다.
나는 perfplot(애완동물 프로젝트, 기본적으로 랩퍼)로 대부분의 제안 솔루션을 테스트했다.timeit
를 발견하였습니다.
import functools
import operator
functools.reduce(operator.iconcat, a, [])
다수의 작은 리스트와 소수의 긴 리스트가 연결되어 있는 경우 모두 가장 빠른 솔루션이 됩니다.(operator.iadd
마찬가지로 빠릅니다.)
보다 단순하면서도 허용 가능한 변형은 다음과 같습니다.
out = []
for sublist in a:
out.extend(sublist)
서브 리스트의 수가 많은 경우는, 상기의 제안보다 약간 퍼포먼스가 저하합니다.
플롯을 재현하는 코드:
import functools
import itertools
import operator
import numpy as np
import perfplot
def forfor(a):
return [item for sublist in a for item in sublist]
def sum_brackets(a):
return sum(a, [])
def functools_reduce(a):
return functools.reduce(operator.concat, a)
def functools_reduce_iconcat(a):
return functools.reduce(operator.iconcat, a, [])
def itertools_chain(a):
return list(itertools.chain.from_iterable(a))
def numpy_flat(a):
return list(np.array(a).flat)
def numpy_concatenate(a):
return list(np.concatenate(a))
def extend(a):
out = []
for sublist in a:
out.extend(sublist)
return out
b = perfplot.bench(
setup=lambda n: [list(range(10))] * n,
# setup=lambda n: [list(range(n))] * 10,
kernels=[
forfor,
sum_brackets,
functools_reduce,
functools_reduce_iconcat,
itertools_chain,
numpy_flat,
numpy_concatenate,
extend,
],
n_range=[2 ** k for k in range(16)],
xlabel="num lists (of length 10)",
# xlabel="len lists (10 lists total)"
)
b.save("out.png")
b.show()
를 사용하여 누적 목록을 추가합니다.xs
ys
:
from functools import reduce
xss = [[1,2,3], [4,5,6], [7], [8,9]]
out = reduce(lambda xs, ys: xs + ys, xss)
출력:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
다음을 사용하여 보다 빠른 방법:
from functools import reduce
import operator
xss = [[1,2,3], [4,5,6], [7], [8,9]]
out = reduce(operator.concat, xss)
출력:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
다음은 숫자, 문자열, 중첩 목록 및 혼합 컨테이너에 적용되는 일반적인 방법입니다.이렇게 하면 단순 컨테이너와 복잡한 컨테이너를 모두 평평하게 만들 수 있습니다(데모 참조).
코드
from typing import Iterable
#from collections import Iterable # < py38
def flatten(items):
"""Yield items from any nested iterable; see Reference."""
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
for sub_x in flatten(x):
yield sub_x
else:
yield x
주의:
- 3, Python 3의 경우
yield from flatten(x)
할 수for sub_x in flatten(x): yield sub_x
- Python 3.8에서는 추상 기본 클래스가 다음에서 이동됩니다.
collection.abc
typing
★★★★★★ 。
데모
simple = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(flatten(simple))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
complicated = [[1, [2]], (3, 4, {5, 6}, 7), 8, "9"] # numbers, strs, nested & mixed
list(flatten(complicated))
# [1, 2, 3, 4, 5, 6, 7, 8, '9']
언급
- 이 용액은 비즐리, D, B의 레시피에서 수정한 것이다. 존스 레시피 4.14, 파이썬 쿡북 3판, 오라일리 미디어 주식회사 세바스토폴, 캘리포니아: 2013년.
- 이전의 SO 포스트를 찾았습니다. 아마도 원래 시연일 겁니다.
깊이 중첩된 데이터 구조를 평평하게 만들려면 다음과 같이 사용합니다.
>>> from iteration_utilities import deepflatten
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(deepflatten(l, depth=1))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
>>> list(deepflatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
이것은 발전기이기 때문에 당신은 결과를 캐스트해야 합니다.list
아니면 명시적으로 반복할 수도 있습니다.
하나의 레벨만 평평하게 하고 각 아이템이 반복 가능한 경우 얇은 랩에 둘러싸인 것을 사용할 수도 있습니다.
>>> from iteration_utilities import flatten
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(flatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
타이밍을 추가하는 것(이 답변에 제시된 기능이 포함되지 않은 Nico Schlömer의 답변에 근거함)
로그 로그 플롯으로, 광범위한 가치를 수용할 수 있습니다.질적 추론의 경우: 작을수록 좋습니다.
반복 이 몇 , "반복 가능"은 "반복가능"은 "반복 가능"입니다.sum
만, 긴 는, 「반복할 수 있다」, 「반복할 수 없다」, 「반복할 수 없다」, 「반복할 수 없다」, 「반복할 수 없다」, 「반복할 수 없다」, 「반복할 수 없다」만,itertools.chain.from_iterable
,iteration_utilities.deepflatten
가 있습니다.itertools.chain.from_iterable
(니코 슐뢰머가 이미 눈치챘듯이) 가장 빠르다.
from itertools import chain
from functools import reduce
from collections import Iterable # or from collections.abc import Iterable
import operator
from iteration_utilities import deepflatten
def nested_list_comprehension(lsts):
return [item for sublist in lsts for item in sublist]
def itertools_chain_from_iterable(lsts):
return list(chain.from_iterable(lsts))
def pythons_sum(lsts):
return sum(lsts, [])
def reduce_add(lsts):
return reduce(lambda x, y: x + y, lsts)
def pylangs_flatten(lsts):
return list(flatten(lsts))
def flatten(items):
"""Yield items from any nested iterable; see REF."""
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
yield from flatten(x)
else:
yield x
def reduce_concat(lsts):
return reduce(operator.concat, lsts)
def iteration_utilities_deepflatten(lsts):
return list(deepflatten(lsts, depth=1))
from simple_benchmark import benchmark
b = benchmark(
[nested_list_comprehension, itertools_chain_from_iterable, pythons_sum, reduce_add,
pylangs_flatten, reduce_concat, iteration_utilities_deepflatten],
arguments={2**i: [[0]*5]*(2**i) for i in range(1, 13)},
argument_name='number of inner lists'
)
b.plot()
1 면책사항:제가 그 도서관의 저자예요.
다음은 가장 간단한 것 같습니다.
>>> import numpy as np
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> print(np.concatenate(l))
[1 2 3 4 5 6 7 8 9]
패키지의 인스톨을 검토해 주세요.
> pip install more_itertools
이 제품에는 (소스, retertools 레시피에서) 다음과 같은 구현이 포함되어 있습니다.
import more_itertools
lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(more_itertools.flatten(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
주의: 문서에서 설명한 바와 같이flatten
에는 목록 목록이 필요합니다.불규칙한 입력의 평탄화에 대해서는, 이하를 참조해 주세요.
버전 2.4부터는 (소스, abarnet에 의해 제공됨)을 사용하여 더 복잡하고 중첩된 반복가능성을 평평하게 만들 수 있습니다.
lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(more_itertools.collapse(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst = [[1, 2, 3], [[4, 5, 6]], [[[7]]], 8, 9] # complex nesting
list(more_itertools.collapse(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
기능이 작동하지 않는 이유는 익스텐트가 어레이를 인플레이스 확장하여 반환하지 않기 때문입니다.다음과 같은 방법으로 람다에서 x를 반환할 수 있습니다.
reduce(lambda x,y: x.extend(y) or x, l)
주의: 목록의 +보다 확장이 효율적입니다.
matplotlib.cbook.flatten()
는, 된 다 더 에서도 기능합니다.
import matplotlib
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
print(list(matplotlib.cbook.flatten(l)))
l2 = [[1, 2, 3], [4, 5, 6], [7], [8, [9, 10, [11, 12, [13]]]]]
print(list(matplotlib.cbook.flatten(l2)))
결과:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
이는 언더스코어보다 18배 빠른 속도입니다. 플랫텐:
Average time over 1000 trials of matplotlib.cbook.flatten: 2.55e-05 sec
Average time over 1000 trials of underscore._.flatten: 4.63e-04 sec
(time for underscore._)/(time for matplotlib.cbook) = 18.1233394636
의 리스트에 [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
인 1개의 목록 수준을 간단하게 할 수 .sum(list,[])
라이브러리도 하지 않고
sum([[1, 2, 3], [4, 5, 6], [7], [8, 9]],[])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
내부에 태플 또는 번호가 존재하는 경우 이 방법의 장점을 확장합니다. 매핑 만으로, 각 요소에 매핑 을 추가할 수 .map
#For only tuple
sum(list(map(list,[[1, 2, 3], (4, 5, 6), (7,), [8, 9]])),[])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
#In general
def convert(x):
if type(x) is int or type(x) is float:
return [x]
else:
return list(x)
sum(list(map(convert,[[1, 2, 3], (4, 5, 6), 7, [8, 9]])),[])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
여기에서는, 이 어프로치의 메모리 면에서의 결점에 대해 명확하게 설명합니다.즉, 리스트 오브젝트를 재귀적으로 작성합니다.이러한 오브젝트는 피해야 합니다.
NumPy의 플랫도 사용할 수 있습니다.
import numpy as np
list(np.array(l).flat)
하위 목록의 치수가 동일한 경우에만 작동합니다.
의 2를 사용합니다.for
록록: :
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
flat_l = [e for v in l for e in v]
print(flat_l)
.list
extend
가장 빠른 것으로 나타납니다.
flat_list = []
for sublist in l:
flat_list.extend(sublist)
퍼포먼스:
import functools
import itertools
import numpy
import operator
import perfplot
def functools_reduce_iconcat(a):
return functools.reduce(operator.iconcat, a, [])
def itertools_chain(a):
return list(itertools.chain.from_iterable(a))
def numpy_flat(a):
return list(numpy.array(a).flat)
def extend(a):
n = []
list(map(n.extend, a))
return n
perfplot.show(
setup = lambda n: [list(range(10))] * n,
kernels = [
functools_reduce_iconcat, extend, itertools_chain, numpy_flat
],
n_range = [2**k for k in range(16)],
xlabel = 'num lists',
)
출력:
과 같은 이 여러 개 도 이 방법을 .try
이를 통해 솔루션을 더욱 견고하고 피토닉하게 만들 수 있습니다.
def flatten(itr):
for x in itr:
try:
yield from flatten(x)
except TypeError:
yield x
용도: 이것은 제너레이터입니다.일반적으로 다음과 같은 반복 가능한 빌더에 동봉하는 것이 좋습니다.list()
★★★★★★★★★★★★★★★★★」tuple()
을 사용하세요.for
loopsyslog.syslog..syslog.
이 솔루션의 장점은 다음과 같습니다.
- 모든 종류의 반복 가능한 기능(미래에도 사용 가능)을 갖추고 있습니다.
- 둥지의 어떤 조합과 깊이에도 효과가 있다
- 최상위 레벨에 베어 아이템이 포함되어 있는 경우에도 기능합니다.
- 의존 관계 없음
- 빠르고 효율적입니다(필요 없는 나머지 부분에 시간을 낭비하지 않고 부분적으로 반복 가능한 중첩된 부분을 평평하게 만들 수 있습니다).
- 다용도(선택한 반복 가능한 구성 또는 루프 형태로 구성하기 위해 사용할 수 있습니다.
N.B.: 모든 반복 가능 항목이 평평하기 때문에 문자열은 단일 문자로 분해됩니다.이러한 동작이 마음에 들지 않는 경우는, 문자열이나 바이트등의 반복 가능성의 편평화를 제외하는 다음의 버전을 사용할 수 있습니다.
def flatten(itr):
if type(itr) in (str,bytes):
yield itr
else:
for x in itr:
try:
yield from flatten(x)
except TypeError:
yield x
룩을 , ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★numpy.concatenate().tolist()
★★★★★★★★★★★★★★★★★」numpy.concatenate().ravel().tolist()
:
import numpy
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] * 99
%timeit numpy.concatenate(l).ravel().tolist()
1000 loops, best of 3: 313 µs per loop
%timeit numpy.concatenate(l).tolist()
1000 loops, best of 3: 312 µs per loop
%timeit [item for sublist in l for item in sublist]
1000 loops, best of 3: 31.5 µs per loop
상세한 것에 대하여는, 메뉴얼 「numpy.concatenate」및 「numpy.ravel」을 참조해 주세요.
주의: 아래는 Python 3.3+를 사용하기 때문에 적용됩니다.six
는 서드파티제 패키지이지만 안정적입니다.는을 사용할 .sys.version
.
obj = [[1, 2,], [3, 4], [5, 6]]
및 를 한 모든 itertools.chain.from_iterable
.
다만, 조금 더 복잡한 경우를 생각해 봅시다.
>>> obj = [[1, 2, 3], [4, 5], 6, 'abc', [7], [8, [9, 10]]]
여기에는 몇 가지 문제가 있습니다.
- 의 요소, 「」는, 「」입니다.
6
을 사용하다반복할 수 없기 때문에 위의 루트는 여기서 실패합니다. - 의 요소, 「」는, 「」입니다.
'abc'
기술적으로 반복할 수 있습니다(모두).str
s는). 단, 행간을 조금 읽으면, 그렇게 취급하는 것이 아니라 단일 요소로 취급하는 것이 좋습니다. - 요소인 '아예'는 '아예'
[8, [9, 10]]
그 자체가 반복할 수 있는 중첩입니다. 목록 및 목록 이해chain.from_iterable
1'은 '1'은 '1'은 '1'은 '1'입니다.
이 문제는 다음과 같이 해결할 수 있습니다.
>>> from collections import Iterable
>>> from six import string_types
>>> def flatten(obj):
... for i in obj:
... if isinstance(i, Iterable) and not isinstance(i, string_types):
... yield from flatten(i)
... else:
... yield i
>>> list(flatten(obj))
[1, 2, 3, 4, 5, 6, 'abc', 7, 8, 9, 10]
여기에서는 서브 요소(1)가 에서의 ABC와 반복 가능한 것을 확인합니다.itertools
단, (2) 요소가 "string-like"가 아님을 확인합니다.
def flatten(alist):
if alist == []:
return []
elif type(alist) is not list:
return [alist]
else:
return flatten(alist[0]) + flatten(alist[1:])
는 여러 개의둥지를 틀 수 .[[1], [[[2]], [3]]], [1, 2, 3]
예를 들어 재귀적이지 않습니다(재귀가 크고 재귀 오류가 발생했습니다.
제가 생각해낸 건 다음과 같습니다.
def _flatten(l) -> Iterator[Any]:
stack = l.copy()
while stack:
item = stack.pop()
if isinstance(item, list):
stack.extend(item)
else:
yield item
def flatten(l) -> Iterator[Any]:
return reversed(list(_flatten(l)))
및 테스트:
@pytest.mark.parametrize('input_list, expected_output', [
([1, 2, 3], [1, 2, 3]),
([[1], 2, 3], [1, 2, 3]),
([[1], [2], 3], [1, 2, 3]),
([[1], [2], [3]], [1, 2, 3]),
([[1], [[2]], [3]], [1, 2, 3]),
([[1], [[[2]], [3]]], [1, 2, 3]),
])
def test_flatten(input_list, expected_output):
assert list(flatten(input_list)) == expected_output
이것이 가장 효율적인 방법은 아닐지도 모르지만, 저는 원라이너(실제로는 투라이너)를 넣으려고 생각했습니다.두 버전 모두 임의의 계층 중첩 목록에서 작동하며 언어 기능(Python 3.5) 및 재귀 기능을 이용합니다.
def make_list_flat (l):
flist = []
flist.extend ([l]) if (type (l) is not list) else [flist.extend (make_list_flat (e)) for e in l]
return flist
a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = make_list_flat(a)
print (flist)
출력은
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
이것은 우선 깊이 있는 방식으로 작용합니다.요소가 된 후 로컬 「」를 합니다.flist
언제 어디서든flist
, , 부모로 확장됩니다.flist
목록 이해에 있어.따라서 루트에서는 플랫리스트가 반환됩니다.
위의 항목은 여러 로컬 목록을 만들고 부모 목록을 확장하는 데 사용되는 목록을 반환합니다. 합니다.flist
이하와 같이.
a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = []
def make_list_flat (l):
flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l]
make_list_flat(a)
print (flist)
출력은 다시
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
현재로서는 효율에 대해서는 잘 모르겠습니다.
원라이너는 아니지만, 여기 있는 모든 답변을 보면, 이 긴 리스트는 패턴 매칭을 놓친 것 같습니다.여기 있습니다.
이 두 가지 방법은 효율적이지 않을 수 있지만, 어쨌든 읽기 쉽습니다(적어도 기능적 프로그래밍으로 인해 망가진 것 같습니다).
def flat(x):
match x:
case []:
return []
case [[*sublist], *r]:
return [*sublist, *flat(r)]
두 번째 버전에서는 목록 목록을 고려합니다.네스팅이 무엇이든:
def flat(x):
match x:
case []:
return []
case [[*sublist], *r]:
return [*flat(sublist), *flat(r)]
case [h, *r]:
return [h, *flat(r)]
이질적 및 동질적 정수 목록에 적용되는 또 다른 특이한 접근법:
from typing import List
def flatten(l: list) -> List[int]:
"""Flatten an arbitrary deep nested list of lists of integers.
Examples:
>>> flatten([1, 2, [1, [10]]])
[1, 2, 1, 10]
Args:
l: Union[l, Union[int, List[int]]
Returns:
Flatted list of integer
"""
return [int(i.strip('[ ]')) for i in str(l).split(',')]
모든 깊이의 목록 목록을 평평하게 만드는 비재귀 함수:
def flatten_list(list1):
out = []
inside = list1
while inside:
x = inside.pop(0)
if isinstance(x, list):
inside[0:0] = x
else:
out.append(x)
return out
l = [[[1,2],3,[4,[[5,6],7],[8]]],[9,10,11]]
flatten_list(l)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
모든 요소를 제거하고 개별 요소 목록을 유지하려면 이 옵션을 사용할 수도 있습니다.
list_of_lists = [[1,2], [2,3], [3,4]]
list(set.union(*[set(s) for s in list_of_lists]))
다음을 사용할 수 있습니다.
def flatlst(lista):
listaplana = []
for k in lista: listaplana = listaplana + k
return listaplana
수율표와 수율표가 있는 발전기를 사용하는 것이 좋습니다.다음은 예를 제시하겠습니다.
from collections.abc import Iterable
def flatten(items, ignore_types=(bytes, str)):
"""
Flatten all of the nested lists to the one. Ignoring flatting of iterable types str and bytes by default.
"""
for x in items:
if isinstance(x, Iterable) and not isinstance(x, ignore_types):
yield from flatten(x)
else:
yield x
values = [7, [4, 3, 5, [7, 3], (3, 4), ('A', {'B', 'C'})]]
for v in flatten(values):
print(v)
것이 , 재귀적인 저의 .flatten
중첩된 목록뿐만 아니라 주어진 컨테이너 또는 항목을 버릴 수 있는 일반적으로 모든 개체를 평평하게 만들 수 있는 함수입니다.이는 모든 중첩 깊이에서도 작동하며 요청에 따라 항목을 생성하는 느린 반복 기능입니다.
def flatten(iterable):
# These types won't considered a sequence or generally a container
exclude = str, bytes
for i in iterable:
try:
if isinstance(i, exclude):
raise TypeError
iter(i)
except TypeError:
yield i
else:
yield from flatten(i)
평평하게뺄 수 있어요.str
이치노
이 사물을 할 수 입니다.iter()
이치노따라서 반복 가능한 개체는 생성기 표현식을 항목으로 가질 수 있습니다.
누군가는 주장할 수 있다:작전본부에서 요청하지도 않았는데 왜 그렇게 일반적이지?그래요, 당신 말이 옳다구요.나는 단지 이것이 누군가에게 도움이 될 수 있을 것 같았다(나 자신을 위해 그랬던 것처럼).
테스트 케이스:
lst1 = [1, {3}, (1, 6), [[3, 8]], [[[5]]], 9, ((((2,),),),)]
lst2 = ['3', B'A', [[[(i ** 2 for i in range(3))]]], range(3)]
print(list(flatten(lst1)))
print(list(flatten(lst2)))
출력:
[1, 3, 1, 6, 3, 8, 5, 9, 2]
['3', b'A', 0, 1, 4, 0, 1, 2]
여기에 여러 개의 목록이 포함된 목록의 경우, 나에게 적합한 재귀적 해결 방법이 있습니다.
# Question 4
def flatten(input_ls=[]) -> []:
res_ls = []
res_ls = flatten_recursive(input_ls, res_ls)
print("Final flatten list solution is: \n", res_ls)
return res_ls
def flatten_recursive(input_ls=[], res_ls=[]) -> []:
tmp_ls = []
for i in input_ls:
if isinstance(i, int):
res_ls.append(i)
else:
tmp_ls = i
tmp_ls.append(flatten_recursive(i, res_ls))
print(res_ls)
return res_ls
flatten([0, 1, [2, 3], 4, [5, 6]]) # test
flatten([0, [[[1]]], [[2, 3], [4, [[5, 6]]]]])
출력:
[0, 1, 2, 3]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
Final flatten list solution is:
[0, 1, 2, 3, 4, 5, 6]
[0, 1]
[0, 1]
[0, 1]
[0, 1, 2, 3]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
Final flatten list solution is:
[0, 1, 2, 3, 4, 5, 6]
목록에 정수만 있는 경우:
import re
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(map(int,re.sub('(\[|\])','',str(l)).split(',')))
언급URL : https://stackoverflow.com/questions/952914/how-do-i-make-a-flat-list-out-of-a-list-of-lists
'source' 카테고리의 다른 글
"package private" 멤버액세스는 디폴트(수정자 없음)액세스와 동의어 아닌가요? (0) | 2022.11.24 |
---|---|
마리아에 대한 XAMPP 루트 사용자 암호 설정DB (0) | 2022.11.24 |
왜 Python의 '프라이빗' 메서드는 실제로 비공개 방식이 아닐까요? (0) | 2022.11.23 |
cURL 오류 60: SSL 인증서: 로컬 발급자 인증서를 가져올 수 없습니다. (0) | 2022.11.23 |
코드가 종료되면 경보음이 울립니다. (0) | 2022.11.23 |