HOWTO · Python

Python의 사전 배열 또는 목록

이 자습서는 Python에서 사전 배열을 만드는 방법을 보여줍니다.

이 페이지의 내용

Python에서는 딕셔너리 여러 개를 담을 때 리스트를 주로 사용합니다. 리스트의 각 요소에는 키-값 쌍으로 이루어진 레코드를 저장할 수 있습니다. 이를 딕셔너리 배열이라고 부르기도 하지만, Python 리스트와 특수 배열 자료형은 서로 다릅니다. 아래 예제에서는 리스트를 만들고, 인덱스로 레코드에 접근하고 값을 읽으며, 레코드를 추가하고 값을 수정하는 방법을 살펴봅니다.

Python에서 딕셔너리 리스트 만들기

리스트 리터럴 안에 각 딕셔너리를 요소로 작성합니다. 각각의 리터럴은 별개의 딕셔너리를 만들기 때문에 레코드마다 서로 다른 키를 사용하거나 일부 키를 공유할 수 있습니다. records처럼 의미가 분명한 변수 이름을 사용하세요. list는 이미 Python 내장 이름입니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = [
    {"name": "Ada", "role": "engineer"},
    {"name": "Lin", "role": "designer"},
]
print(records)
[{'name': 'Ada', 'role': 'engineer'}, {'name': 'Lin', 'role': 'designer'}]

인덱스와 키로 딕셔너리 및 값에 접근하기

Python 리스트의 인덱스는 0부터 시작하므로 인덱스 1은 두 번째 딕셔너리를 가리킵니다. 필드 값을 읽으려면 먼저 리스트 인덱스로 딕셔너리를 선택한 다음 대괄호 안에 키를 지정합니다. 하나의 표현식에서 리스트와 딕셔너리를 차례로 조회하는 두 단계입니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = [
    {"name": "Ada", "role": "engineer"},
    {"name": "Lin", "role": "designer"},
]
second_record = records[1]
role = records[1]["role"]
print(second_record)
print(role)
{'name': 'Lin', 'role': 'designer'}
designer

대괄호로 조회하려면 선택한 딕셔너리에 해당 키가 있어야 합니다. 키가 없을 수도 있다면 record.get("role")을 사용하세요. 기본적으로 키가 없을 때 None을 반환합니다. record.get("role", "unknown")처럼 대체값을 지정할 수도 있습니다.

리스트에 딕셔너리 추가하기

append()를 호출하면 기존 리스트의 끝에 딕셔너리 하나가 추가됩니다. 이 메서드는 리스트 자체를 변경하며 새 리스트를 만들지 않습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = [{"name": "Ada", "role": "engineer"}]
records.append({"name": "Lin", "role": "designer"})
print(records)
[{'name': 'Ada', 'role': 'engineer'}, {'name': 'Lin', 'role': 'designer'}]

리스트 안의 딕셔너리 수정하기

인덱스로 레코드를 선택한 다음 키에 값을 할당해 수정합니다. 딕셔너리에 아직 없는 키에 값을 할당하면 그 키가 추가됩니다. 따라서 같은 문법으로 기존 필드의 값을 바꾸거나 새 필드를 추가할 수 있습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = [{"name": "Ada", "role": "engineer"}]
records[0]["role"] = "lead engineer"
records[0]["team"] = "platform"
print(records)
[{'name': 'Ada', 'role': 'lead engineer', 'team': 'platform'}]

리스트 컴프리헨션으로 딕셔너리 리스트 만들기

각 레코드의 형식이 같다면 리스트 컴프리헨션을 사용해 간결하게 만들 수 있습니다. 표현식에 딕셔너리 리터럴을 넣으면 반복할 때마다 별개의 딕셔너리가 생성됩니다. 예를 들어 아래 코드는 같은 필드로 초기화된 딕셔너리 네 개를 만듭니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = [{"active": True, "score": 0} for _ in range(4)]
print(records)
[{'active': True, 'score': 0}, {'active': True, 'score': 0}, {'active': True, 'score': 0}, {'active': True, 'score': 0}]

대신 빈 딕셔너리를 여러 개 만들려면 각 반복에서 dict()를 호출하면 됩니다.

records = [dict() for _ in range(3)]
print(records)
[{}, {}, {}]

컴프리헨션에서 반복 가능한 객체의 값으로 필드 값을 만들 수도 있습니다.

records = [{"id": number, "label": f"item-{number}"} for number in range(3)]
print(records)
[{'id': 0, 'label': 'item-0'}, {'id': 1, 'label': 'item-1'}, {'id': 2, 'label': 'item-2'}]

변경 가능한 딕셔너리 하나가 든 리스트를 곱셈해 여러 레코드처럼 반복하는 방식은 피하세요. 예를 들어 [{}] * 3은 같은 딕셔너리에 대한 참조를 세 번 반복합니다. 따라서 한 요소를 수정하면 세 위치 모두에서 변경된 내용이 보입니다. {}를 사용하는 컴프리헨션은 반복마다 새 딕셔너리를 만듭니다.

반복문에서 딕셔너리 만들기

각 딕셔너리를 여러 단계로 만들거나 조건에 따라 필드를 추가해야 한다면 반복문을 사용하세요. 반복할 때마다 새 딕셔너리를 만든 다음 리스트에 추가합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = []
for number in range(3):
    record = {"id": number, "score": number * 10}
    records.append(record)

for record in records:
    print(record)
{'id': 0, 'score': 0}
{'id': 1, 'score': 10}
{'id': 2, 'score': 20}

반복문을 한 번 돌 때마다 현재 number를 사용해 레코드 하나를 만듭니다. 다음 반복으로 넘어가기 전에 append()가 그 딕셔너리를 리스트에 저장합니다.

dict() 생성자로 딕셔너리 만들기

인수 없이 dict() 생성자를 호출하면 빈 딕셔너리가 만들어집니다. 키워드 필드를 전달해 딕셔너리를 만들 수도 있으며, 키워드 이름은 문자열 키가 됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

blank_record = dict()
person = dict(name="John", age=30, city="New York")
print(blank_record)
print(person)
{}
{'name': 'John', 'age': 30, 'city': 'New York'}

각각 별도로 dict()를 호출하면 리스트에 넣을 딕셔너리를 만들 수 있습니다.

records = [
    dict(name="Ada", role="engineer"),
    dict(name="Lin", role="designer"),
]
for record in records:
    print(record)
{'name': 'Ada', 'role': 'engineer'}
{'name': 'Lin', 'role': 'designer'}

딕셔너리 키는 해시 가능해야 합니다. 문자열과 숫자, 해시 가능한 값으로 이루어진 튜플은 키로 사용할 수 있지만 리스트처럼 변경 가능한 자료형은 키로 사용할 수 없습니다. 딕셔너리에는 같은 키가 두 번 들어갈 수 없습니다. 중복된 키-값 쌍으로 딕셔너리를 만들면 나중 값이 앞선 값을 덮어씁니다. dict()에 키워드 인수를 전달할 때는 호출에서 키워드를 한 번씩만 쓸 수 있으므로, 입력에 중복 키가 있을 수 있다면 매핑이나 키-값 쌍의 시퀀스를 사용하세요.