[python] list - 2중, 3중 리스트 생성

2024. 1. 2. 18:52·python

일단 2중, 3중 리스트 생성 시 기억해야 할 점은

 

1. 리스트는 for _ in range() 구문과 * 구문의 적절한 조합으로 생성 가능하다는 것,

   - * 사용 시 자동으로 1회 unpacking이 이루어 진다는 것

   - for _ in range() 사용 시 자동 unpacking은 없으나, 타입이 generator 객체이므로 list로 형변환 할 것

2. for _ in range() 구문에서 순서 주의할 것 (column -> row 순서 ) 

이 두 가지이다.

 

 

경우에 따라 나눠, 자세히 알아보자.

 


1.  2중 리스트 생성


[1] 목표 설정

예를 들어 다음과 같은  row = 3, column = 2인 2중 리스트를 생성한다고 가정하자.

즉,  [[0, 0], [0, 0], [0, 0]]인 리스트를 생성하자.

[[0, 0], [0, 0], [0, 0]] 2중 리스트

 

 


[2] 코드 작성

# 목표
# [[0, 0], [1, 1], [2, 2]]

해당 목표를 달성하기 위한 코드는 여러 가지가 있다.

 

 

(1) * 구문 (O)

# (1)
print([[0] * 2] * 3)
# 결과: [[0, 0], [0, 0], [0, 0]]

- [0, 0] : 가장 안쪽의 리스트를 (column 수만큼을 크기=원소개수=len 로 갖는)  생성하고 ([0] * 2 결과)

- [0, 0], [0, 0], [0, 0] : *3을 함으로써 row를 생성한다 ([[0, 0]] * 3 결과)

 ** 주의: [[0, 0]] * 3 이 아니라, [0, 0] * 3 사용 시 [0, 0, 0, 0, 0, 0] 출력 

** 즉, * 사용 시에는 한 번 더 []로 감싸야 함

 

 

(2) * 구문과 for _ in range() 구문 (O)

# (2)
print([[0] * 2 for _ in range(3)])
# 결과: [[0, 0], [0, 0], [0, 0]]

# 참고: type([0] * 2 for _ in range(3)) -> <class 'generator'>

- [0, 0]: 가장 안쪽의 리스트를 (column 수만큼을 크기=원소개수=len 로 갖는)  생성하고([0] * 2 결과)

- [0, 0], [0, 0], [0, 0] : for _ in range(3) 문을 통해  [0] * 2를 3번 반복한다는 의미이다. 

      이때, for _ in range(3)문의 return값은 generator이다.

      원소를 확인하면 [0, 0]이 각 원소인 것을 확인할 수 있다.

generator = ([0] * 2 for _ in range(3))
for item in generator:
    print(item)
# 결과: [[0, 0], [0, 0], [0, 0]]

       for _ in range(3) 구문의 결과 (generator)를 리스트로 변환하여 -> 원하는 배열 [[0, 0], [0, 0], [0, 0]]을 얻을 수 있다.

      ([for구문] 을 통해 리스트로 변환)

 

 

(3) * 구문과 for _ in range() 구문 (X)

# (3)
print([[0] for _ in range(2)] * 3)
# 결과: [[0], [0], [0], [0], [0], [0]]

 

(2) 경우와 for문, *의 순서만 바뀌었다.

이때 [0]이 하나씩만 만들어진다.

- generator 객체: [0] for _ in range(2)의 결과

- [[0], [0]] : [[0] for _ in range(2)]의 결과

- [0], [0] : [[0], [0]]을 1번 언패킹한 결과 ([[0], [0]] * 3의 중간과정)

- [[0], [0], [0], [0], [0], [0]]: [[0], [0]] * 3의 결과

 


[3] 결론

[0] -> [0, 0]으로 만들기 위해서는 *를 이용해야 한다. (for문 사용 안됨 !)

[0] -> [0], [0]으로 만들기 위해서는 * 또는 for _ in range() 구문을 이용한다. 

    - * 사용 시, 한 번 더 []로 감싸야 한다  (unpacking 자동으로 1번 이루어짐)

    - for _ in range() 사용 시, unpacking이 자동으로 이루어지지 않는다. (단, 결과가 generator 객체이므로 list 형변환 필요)

 

 

 

 


2.  3중 리스트 생성


[1] 목표 설정

예를 들어 다음과 같은  높이=2, 세로=2, 가로=3인 2중 리스트를 생성한다고 가정하자.

즉,  [ [[0, 0, 0], [0, 0, 0]],  [[0, 0, 0], [0, 0, 0]] ] 인 리스트를 생성하자.

[ [[0, 0, 0], [0, 0, 0]],&nbsp;&nbsp;[[0, 0, 0], [0, 0, 0]] ] &nbsp;3중 리스트

 


[2] 코드 작성

# 목표
# [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]

해당 목표를 달성하기 위한 코드는 여러 가지가 있다.

 

 

# (1)
print([[[0] * 3 for _ in range(2)] for _ in range(2)])
# 결과: [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]

- [0, 0, 0] : [0] * 3의 결과

- [[0, 0, 0], [0, 0, 0], [0, 0, 0]] :  [[0] * 3 for _ in range(2)]의 결과

- [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]:  [[0] * 3 for _ in range(2)] for _ in range(2)의 결과

** 즉, * 사용 시에는 한 번 더 []로 감싸야 함

 

# (1) 
print([[[0] *3 for _ in range(2)] for _ in range(2)])
# 결과: [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]

# (2)
print([[[0] *3] * 2 for _ in range(2)])
# 결과: [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]

# (3)
print([[[0] *3] * 2] * 2)
# 결과: [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]

 

아래 모두 다 가능 !

 

- [[[[0] * 가로] for _ in range(세로)] * 높이 

- [[[[0] * 가로] for _ in range(세로)] for _ in range(높이)]           # (1) 

- [[[[0] * 가로] * 세로 for _ in range(높이)]                                 # (2) 

- [[[[0] * 가로] * 세로] * 높이                                                       # (3)


[3] 결론 (2중 리스트 결론과 동일)

[0] -> [0, 0]으로 만들기 위해서는 *를 이용해야 한다. (for문 사용 안됨 !)

[0] -> [0], [0]으로 만들기 위해서는 * 또는 for _ in range() 구문을 이용한다. 

    - * 사용 시, 한 번 더 []로 감싸야 한다  (unpacking 자동으로 1번 이루어짐)

    - for _ in range() 사용 시, unpacking이 자동으로 이루어지지 않는다. (단, 결과가 generator 객체이므로 list 형변환 필요)

 

 

'python' 카테고리의 다른 글

[python] 우선순위 큐 PriorityQueue VS heapq  (1) 2024.09.22
[python] list - flatten  (1) 2024.01.02
'python' 카테고리의 다른 글
  • [python] 우선순위 큐 PriorityQueue VS heapq
  • [python] list - flatten
KyuminKim
KyuminKim
컴퓨터공학과 학생의 이모저모 개발 일지 📝
  • KyuminKim
    이모저모
    KyuminKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 프로젝트 (2)
        • first-blog (2)
      • 클라우드 (22)
        • 도커 (14)
        • 쿠버네티스 (5)
        • AWS (2)
      • 알고리즘 (5)
        • 코드트리 (0)
        • 프로그래머스 (5)
      • 백엔드 (8)
      • 프론트엔드 (2)
      • 보안 (3)
        • 드림핵 (2)
      • python (3)
      • 네트워크 (1)
      • 기타 (6)
        • 2025 프로펙트 부트캠프(1차) | 클라우드 엔.. (0)
        • OSSCA | 2024 오픈소스 컨트리뷰션 아카데.. (0)
        • WIK (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    고랭
    도커파일
    알고리즘
    오블완
    recover_your_data
    apiserver-runtime
    MySQL
    도커
    진단평가
    티스토리챌린지
    urf8
    쿠버네티스
    DB
    자료구조
    코드트리
    cannot send an empty message
    characterencoding
    코딩테스트
    주간레포트
    코딩트리조별과제
    코드트리조별과제
    DP
    EC2
    docker
    탈퇴구현
    2024 당근 테크 밋업
    amazonlinux
    파이썬
    character_set_server
    인코딩
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
KyuminKim
[python] list - 2중, 3중 리스트 생성
상단으로

티스토리툴바