logo

Python의 평면화 목록

소개

목록 Python 프로그래밍 언어에서 가장 유연한 데이터 구조 중 하나로 간주됩니다. 반면, 2차원 목록, 즉 일반적으로 목록의 목록이라고 불리는 2D 목록은 각 요소가 목록 자체인 목록의 객체입니다. 예: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

목록의 목록을 평면화하는 것은 목록의 목록에 보관된 모든 목록 요소를 중첩 해제하여 2차원 목록을 1차원 목록으로 변환하는 프로세스입니다. 즉, [[9, 8, 7], [6]을 변환합니다. , 5, 4], [3, 2, 1]] ~ [9, 8, 7, 6, 5, 4, 3, 2, 1].

중첩된 함수의 도움으로 평면화 프로세스를 수행할 수 있습니다. ~을 위한 루프, 재귀, 목록 이해, 핵심 기능 또는 중첩 목록의 깊이와 규칙성에 대한 Python의 라이브러리 또는 패키지 가져오기.

이 튜토리얼에서는 Python 프로그래밍 언어를 사용하여 중첩 목록을 평면화하기 위한 다양한 방법을 연구할 것입니다. 하지만 시작하기 전에 중첩 목록의 유형을 이해해 보겠습니다.

중첩 목록의 유형은 무엇입니까?

우리가 알고 있듯이, 파이썬 약한 유형의 프로그래밍 언어입니다. 따라서 우리는 두 가지 유형의 목록 목록을 만날 수 있습니다. 이러한 목록 목록 또는 중첩 목록은 다음과 같습니다.

  1. 목록의 일반 목록
  2. 불규칙한 목록 목록

목록의 일반 목록

목록의 일반 목록에 있는 각 항목을 하위 목록이라고 하며, 따라서 요소 유형의 통일성을 관찰합니다. 예를 들어: [[9, 8, 7], [6, 5, 4], [3, 2, 1]]은 [9, 8, 7], [6, 5, 4]와 같은 목록의 일반 목록입니다. , [3, 2, 1]은 목록 유형입니다.

불규칙한 목록 목록

자바 문자열 조인

불규칙 목록 목록의 각 항목은 하위 목록 또는 비목록 요소(예: 문자열 또는 정수)라고 합니다. 따라서 요소의 유형 측면에서 불규칙성이 있습니다. 예를 들어, [[9, 8, 7], [6, 5], 4, 3]은 [9, 8, 7]과 [6, 5]가 목록 유형인 반면, 4는 불규칙 목록입니다. 3개는 int 유형입니다.

중첩된 for 루프를 사용하여 목록 목록 평면화

중첩된 목록으로 목록 평면화 ~을 위한 루프의 도움은 단순 목록을 얻기 위한 무차별 접근 방식으로 간주됩니다. 2차원 목록에서 각 항목을 선택하고 1차원 목록에 배열하여 이 방법을 수행할 수 있습니다.

정규 목록과 불규칙 목록 모두에 대해 작동하는 다음 예를 고려해 보겠습니다.

예:

 # defining the function def flattenlist(_2dlist): # defining an empty list flatlist = [] # Iterating through the outer list for item in _2dlist: if type(item) is list: # If the item is of the list type, iterating through the sub-list for element in item: flatlist.append(element) else: flatlist.append(item) return flatlist # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] print('Genuine List:', nestedlist) print('Converted Flat List:', flattenlist(nestedlist)) 

산출:

 Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

설명:

위의 예에서 우리는 함수를 다음과 같이 정의했습니다. 평탄화 목록 매개변수를 다음과 같이 취합니다. _2dlist . 그런 다음 우리는 ~을 위한 중첩 목록의 요소를 반복하고 추가하여 평면화된 목록을 생성하는 루프입니다. 그런 다음 중첩 목록을 정의하고 평탄화 목록 기능. 결과적으로 중첩된 목록이 평면화된 목록으로 성공적으로 변환되었습니다.

List Comprehension을 사용하여 중첩 목록 평면화

List Comprehension의 도움으로 목록 목록을 평면화하는 것은 기존 2차원 목록에 따라 평면 목록을 얻는 우아한 접근 방식으로 간주됩니다. 그러나 이 접근 방식은 덜 직관적인 솔루션을 제공합니다.

다음 예를 고려해 보겠습니다.

예:

 # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # list comprehension flatlist = [element for sub_list in nestedlist for element in sub_list] print('Genuine list:', nestedlist) print('Converted list:', flatlist) 

산출:

 Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

설명:

위의 예에서는 중첩 목록과 목록 이해를 정의했습니다. 그런 다음 사용자를 위해 인쇄했습니다. 결과적으로 중첩 목록이 평면화된 목록으로 성공적으로 변환되었습니다.

재귀적 방법을 사용하여 목록 목록 평면화

재귀적 방법을 사용하여 2차원 목록을 평면화할 수도 있습니다. 목록 목록을 평면화하기 위해 재귀 메서드를 구현하는 다음 예제를 고려해 보겠습니다. 이 구현은 불규칙한 목록뿐만 아니라 일반 목록에도 잘 작동합니다.

예:

 # defining a function def flattenlist(nestedlist): if len(nestedlist) == 0: return nestedlist if isinstance(nestedlist[0], list): return flattenlist(nestedlist[0]) + flattenlist(nestedlist[1:]) return nestedlist[:1] + flattenlist(nestedlist[1:]) print(flattenlist([[10, 20, 30, 40], [50, 60, 70], [80, 90], 100])) 

산출:

 [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

설명:

위의 예에서는 함수를 정의하고 만약에 성명 중첩 목록의 길이가 0이면 중첩 목록을 반환합니다.

문자열.형식 자바

0번째 인덱스의 데이터 요소가 목록의 인스턴스인 경우 목록 인덱스는 다시 함수에 들어가 목록의 다음 인덱스에 추가됩니다. 그렇지 않으면 함수는 요소 등을 반환합니다. 마침내 중첩 목록을 정의하고 함수를 실행했습니다. 결과적으로 목록 목록이 재귀적으로 평면화되었습니다.

Python 라이브러리 활용

또한 일부 Python 프로그래밍 언어 라이브러리를 활용하여 목록 목록을 평면화할 수도 있습니다. 이러한 라이브러리의 구현은 아래에 설명되어 있습니다.

functools 및 연산자 라이브러리를 사용하여 목록 목록 평면화

그만큼 운영자 도서관은 아이콘캣() 연결과 같은 기본적인 작업을 수행하는 함수입니다. 이 함수를 중첩 목록의 데이터 요소에 왼쪽에서 오른쪽으로 누적적으로 적용하면 중첩 목록이 평면화된 목록으로 축소됩니다.

구현을 이해하기 위해 다음 예를 고려해 보겠습니다.

예:

 # importing the required libraries import operator import functools regularlist = [] # Converting the list of lists into a flattened one. def convo(nestedlist): for element in nestedlist: if type(element) is list: regularlist.append(element) else: regularlist.append([element]) return regularlist twoDlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] regular2Dlist = convo(twoDlist) print('Given List:', twoDlist) print('Converted list:', functools.reduce(operator.iconcat, regular2Dlist, [])) 

산출:

 Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] 

설명:

문자열 Java에서 모두 교체

위의 예에서는 기능 도구 도서관과 함께 운영자 도서관. 그런 다음 빈 목록을 다음과 같이 정의했습니다. 정규리스트 . 그런 다음 함수를 다음과 같이 정의했습니다. 대화 목록 목록을 평면화된 목록으로 변환합니다. 이 함수에서는 다음을 사용했습니다. ~을 위한 중첩 목록의 요소가 이전에 정의한 빈 목록에 추가되는 루프입니다. 나중에 우리는 중첩된 목록을 정의하고 함수를 실행합니다. 결과적으로 목록 목록이 평면화된 목록으로 성공적으로 변환되었습니다.

itertools 라이브러리를 사용하여 목록 목록 평면화

그만큼 itertools 도서관은 체인() 이상적으로는 중첩된 목록을 단일 평면화된 목록으로 변환할 수 있는 함수입니다. 이 함수는 직렬 방식으로 매개변수로 전달된 반복 가능 항목을 통해 반복하여 연속 계열을 단일 계열로 처리합니다.

다음 예를 고려해 보겠습니다.

예:

 # importing the itertools library import itertools # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] flattenlist = list(itertools.chain(*nestedlist)) print('The nested list:', nestedlist) print('The flattened list:', flattenlist 

산출:

 The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

설명:

위의 예에서는 itertools 라이브러리를 만들고 중첩 목록을 생성했습니다. 그런 다음 우리는 체인() 주어진 중첩 목록을 평면화된 목록으로 변환하는 함수입니다. 드디어 그 결과를 유저분들께 돌려드렸습니다. 결과적으로 목록 목록이 성공적으로 평면화되었습니다.

NumPy 라이브러리를 사용하여 목록 목록 평면화

그만큼 넘파이 라이브러리는 2차원 일반 배열을 열 단위 또는 행 단위로 연결하는 등 다양한 일상 작업을 제공합니다. 우리는 다음과 같은 속성을 사용할 것입니다. 평평한 목표를 정복하기 위해 배열에 대한 1차원 반복자를 확보하기 위해. 연결 함수와 플랫 속성의 사용을 이해하기 위해 다음 예를 살펴보겠습니다.

예:

 # importing the library import numpy # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the concatenate function along with the flat attribute flattenlist = list(numpy.concatenate(nestedlist).flat) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

산출:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

설명:

위의 예에서는 멍청하다 라이브러리를 사용하고 중첩 목록을 정의했습니다. 그런 다음 우리는 사슬 같이 잇다 의 기능 멍청하다 그와 함께 도서관 평평한 중첩된 목록의 요소를 평면화하고 이를 새로운 평면화된 목록에 연결하는 속성입니다. 마침내 우리는 사용자들을 위해 결과를 인쇄했습니다. 따라서 목록 목록이 성공적으로 평면화되었습니다.

핵심 기능 활용

Python 프로그래밍 언어가 제공하는 일부 핵심 기능을 활용하여 평면화 작업을 수행할 수도 있습니다.

sum 함수를 사용하여 목록 목록 평면화

문제에 대한 또 다른 해결책으로 내부 목록에 대한 합산을 고려할 수 있습니다. 우리는 두 가지 인수를 전달합니다. 합집합 기능: 첫 번째 매개변수는 반복 가능한 , 이는 중첩된 목록이고 두 번째 매개변수는 다음과 같습니다. 시작 이는 내부 하위 목록의 데이터 요소가 추가될 초기 단순 목록 역할을 하는 다음 경우에 대한 무효 목록입니다.

이 접근 방식은 아무것도 가져올 필요가 없기 때문에 매우 편리하다고 말할 수 있습니다. 다만, 생각보다 속도가 느리다. itertools() 그리고 체인() 중첩 목록에 하위 목록이 많이 있을 때 작동합니다.

javac가 인식되지 않습니다

다음 예를 고려해 보겠습니다.

예:

 # defining a nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the sum function flattenlist = sum(nestedlist, []) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

산출:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

설명:

위의 예에서는 중첩 목록을 정의했습니다. 그런 다음 우리는 합집합() 기능을 수행하고 중첩된 목록을 1차원 목록으로 평면화하고 사용자를 위해 결과 목록을 인쇄했습니다. 그 결과, 목록 목록을 단순 목록으로 성공적으로 변환했습니다.

Lambda 키워드를 사용하여 목록 목록 평면화

키워드를 사용하여 익명 함수를 정의할 수 있습니다. 람다 . 이 익명 함수에 매개변수로 일반/불규칙 목록을 전달할 수 있습니다. 표현식의 평가는 평면적인 1차원 목록을 얻기 위해 수행됩니다.

다음 예를 고려해 보겠습니다.

예:

 # Defining the nested list nestedlist = [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] # Using lambda parameters: expression flattenlist = lambda nestedlist:[item for element in nestedlist for item in flattenlist(element)] if type(nestedlist) is list else [nestedlist] print('The Nested list:', nestedlist) print('The Flattened List:', flattenlist(nestedlist)) 

산출:

 The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70] 

설명:

위의 예에서는 중첩 목록을 정의했습니다. 그런 다음 우리는 람다 목록 이해를 위한 표현식을 정의하는 인수와 함께 키워드. 그런 다음 사용자를 위해 인쇄했습니다. 그 결과, 2차원 불규칙 목록을 평면화된 목록으로 성공적으로 변환했습니다.