HOWTO · Python
파이썬에서 딕셔너리 키를 리스트로 가져오는 방법
list(), 반복문, 리스트 컴프리헨션, 언패킹으로 파이썬 딕셔너리의 키를 리스트로 가져오고 dict_keys 뷰와 리스트의 차이를 알아봅니다.
이 페이지의 내용
파이썬 딕셔너리의 키를 리스트로 가져오려면 list(my_dict)를 사용합니다. list(my_dict.keys())도 같은 리스트를 만듭니다. 두 표현식 모두 list() 생성자로 딕셔너리의 키를 모아 새 리스트를 만듭니다. 반면 my_dict.keys() 메서드만 호출하면 dict_keys 뷰가 반환됩니다. 이 뷰는 반복할 수 있지만 리스트처럼 인덱스로 요소에 접근할 수는 없습니다. 리스트 객체가 필요할 때 변환하고, 그렇지 않다면 대개 딕셔너리를 직접 순회하면 됩니다.
dict.keys()로 파이썬 딕셔너리 키 가져오기
dict.keys() 메서드는 현재 키를 보여 주는 뷰를 반환합니다. 뷰에는 이후 딕셔너리에 생긴 변경 사항이 반영되지만, 뷰에서 만든 리스트는 생성 시점의 키를 별도로 담습니다. 파이썬 3.7 이상에서는 딕셔너리를 순회할 때 키가 삽입된 순서를 따릅니다. 아래 출력 순서는 이 동작을 전제로 합니다.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys_view = state_capitals.keys()
print(keys_view)
for state in keys_view:
print(state)
keys_list = list(keys_view)
print(keys_list)
print(list(state_capitals))
print(keys_list[0])
state_capitals["Nevada"] = "Carson City"
print(list(keys_view))
print(keys_list)
dict_keys(['California', 'Pennsylvania', 'Texas'])
California
Pennsylvania
Texas
['California', 'Pennsylvania', 'Texas']
['California', 'Pennsylvania', 'Texas']
California
['California', 'Pennsylvania', 'Texas', 'Nevada']
['California', 'Pennsylvania', 'Texas']
list(keys_view)와 list(state_capitals)는 모두 리스트를 만듭니다. 딕셔너리를 순회하면 키가 나오므로 두 번째 표현식도 동작합니다. 뷰 자체에 인덱스로 접근하면 TypeError가 발생합니다. 빈 딕셔너리를 리스트로 변환하면 []가 되며, 이 빈 리스트에 인덱스로 접근하면 IndexError가 발생합니다.
반복문으로 파이썬 딕셔너리 키 가져오기
키를 수집하면서 각각을 처리해야 한다면 명시적인 반복문이 유용합니다. for key in state_capitals처럼 in 키워드를 써야 하며, 반복문에는 값이 아닌 키가 전달됩니다.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys = []
for key in state_capitals:
keys.append(key)
print(keys)
['California', 'Pennsylvania', 'Texas']
딕셔너리가 비어 있으면 반복문은 한 번도 실행되지 않아 keys도 빈 리스트로 남습니다. 반복문 안에서 별도 작업 없이 키만 가져온다면 list(state_capitals)가 더 간결합니다.
리스트 컴프리헨션으로 파이썬 딕셔너리 키 가져오기
리스트 컴프리헨션을 사용하면 같은 수집 작업을 한 줄로 표현할 수 있습니다. 키를 필터링하거나 각 키를 변환하려는 경우에 이 형식이 유용합니다. 키를 그대로 복사할 때는 list() 생성자가 더 간단합니다.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys = [key for key in state_capitals]
print(keys)
['California', 'Pennsylvania', 'Texas']
빈 딕셔너리에 이 리스트 컴프리헨션을 적용해도 []가 반환됩니다.
언패킹 연산자 *로 파이썬 딕셔너리 키 가져오기
반복 가능한 객체를 펼치는 * 구문을 사용하면 [*state_capitals]처럼 딕셔너리의 키를 리스트에 넣을 수 있습니다. PEP 448은 파이썬 3.5에서 언패킹 구문을 일반화했습니다. 이 버전 호환성 설명은 구문 명세에 근거한 것으로, 여기서 파이썬 3.5로 코드를 실행해 확인한 결과는 아닙니다. 언패킹은 튜플과 집합을 만들 때도 사용할 수 있습니다.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys_list = [*state_capitals]
keys_tuple = (*state_capitals,)
keys_set = {*state_capitals}
print(keys_list)
print(keys_tuple)
print(sorted(keys_set))
['California', 'Pennsylvania', 'Texas']
('California', 'Pennsylvania', 'Texas')
['California', 'Pennsylvania', 'Texas']
집합은 중복을 제거하며 출력 순서가 보장되지 않습니다. 예제에서는 sorted()로 정렬해 출력 내용을 예측할 수 있게 했습니다. 파이썬 3.7 이상에서는 리스트와 튜플이 딕셔너리의 순회 순서를 유지합니다. 결과가 실제 리스트여야 한다면 리스트 형태를 사용하세요.
실행 시간 비교
변환 속도가 중요하다면 실제 입력과 크기가 비슷한 딕셔너리를 사용해 자신의 파이썬 인터프리터에서 측정하세요. 다음 스크립트는 파이썬 버전을 출력하고, 100개 항목이 있는 동일한 딕셔너리를 각각 10,000번 변환하는 측정을 다섯 차례 수행한 뒤 가장 짧은 시간을 보여 줍니다. 시간을 측정하는 모든 구문은 매번 새 리스트를 만듭니다. 반복문 방식도 변환할 때마다 빈 결과 리스트를 새로 만듭니다.
import platform
from timeit import repeat
state_capitals = {str(number): number for number in range(100)}
methods = {
"list(d.keys())": "list(state_capitals.keys())",
"list(d)": "list(state_capitals)",
"loop": "keys = []\nfor key in state_capitals:\n keys.append(key)",
"comprehension": "[key for key in state_capitals]",
"unpacking": "[*state_capitals]",
}
print("Python", platform.python_version())
for name, statement in methods.items():
times = repeat(statement, globals=globals(), number=10_000, repeat=5)
print(f"{name}: {min(times) / 10_000:.9f} seconds per conversion")
측정 시간은 인터프리터, 컴퓨터, 딕셔너리 크기에 따라 달라지므로 고정된 출력이나 언제나 가장 빠른 방법은 없습니다. 일반적인 코드에서는 명확한 list(state_capitals)를 우선 사용하고, 변환 비용이 프로그램에서 의미 있는 경우에만 다른 방법도 측정해 비교하세요.