파이썬에서 사전 키를 목록으로 반환하는 방법은 무엇입니까?


779

Python 2.7 에서는 사전 , 또는 항목 을 목록으로 가져올 수 있습니다 .

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

이제 Python> = 3.3 에서 다음과 같은 것을 얻습니다.

>>> newdict.keys()
dict_keys([1, 2, 3])

따라서 목록을 얻으려면이 작업을 수행해야합니다.

newlist = list()
for i in newdict.keys():
    newlist.append(i)

궁금합니다 .Python 3 에서 목록을 반환하는 더 좋은 방법이 있습니까?


이 주제와 관련하여 흥미로운 스레드 안전 문제는 다음과 같습니다. blog.labix.org/2008/06/27/…
Paul

2
나는 파이썬을 처음 접했고, 쓸모없는 새로운 데이터 유형의 확산은 파이썬의 최악의 측면 중 하나 인 것 같습니다. 이 dict_keys 데이터 유형은 어떤 용도로 사용됩니까? 왜 목록이 없습니까?
Phil Goetz

답변:


975

시도하십시오 list(newdict.keys()).

dict_keys개체를 목록으로 변환합니다 .

다른 한편으로, 당신은 그것이 중요한지 아닌지 스스로에게 물어봐야합니다. 파이썬으로 코딩하는 방법은 오리 타이핑을 가정하는 것입니다 ( 오리처럼 보이고 오리처럼 cks 경우 오리입니다 ). dict_keys객체는 대부분의 목적에 대한 목록과 같은 역할을합니다. 예를 들어 :

for key in newdict.keys():
  print(key)

분명히 삽입 연산자는 작동하지 않을 수 있지만 어쨌든 사전 키 목록에는 의미가 없습니다.


49
newdict.keys ()는 인덱싱을 지원하지 않습니다
gypaetus

57
list(newdict)또한 작동합니다 (적어도 파이썬 3.4에서는). 이 .keys()방법 을 사용해야 할 이유가 있습니까?
naught101

46
참고 : 디버거 pdb> list(newdict.keys()) 에서 동일한 이름의 pdb 명령과 충돌하기 때문에 디버거에서 실패합니다. pdb> !list(newdict.keys())pdb 명령을 이스케이프 처리하는 데 사용 합니다.
Riaz Rizvi

23
@ naught101 네, 계속되는 일 .keys()이 더 명확합니다.
Felix D.

2
list (newdict.keys ())를 사용하면 해싱 순서로 인해 키가 배치 된 순서가 아닙니다!
Nate M

277

Python> = 3.5 대안 : 목록 리터럴로 압축 풀기 [*newdict]

Python 3.5에는 새로운 압축 풀기 일반화 (PEP 448) 가 도입되어 이제 쉽게 수행 할 수 있습니다.

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

압축 풀기 *작업 은 반복 가능한 모든 객체 에서 작동 하며, 반복시 사전이 키를 반환하므로 목록 리터럴 내에서 목록을 사용하여 쉽게 목록을 만들 수 있습니다.

추가 .keys()즉 것은 [*newdict.keys()]당신에게 기능 룩업과 호출 비용을 부담해야하지만 의도의 좀 더 명시 적으로 제작에 도움이 될 수 있습니다. (모든 정직에서 실제로 걱정 해야 할 것은 아닙니다 ).

*iterable구문은 수행과 유사 list(iterable)과 그 동작은 처음에 기록 된 통화 섹션 파이썬 참조 설명서의. PEP 448을 사용하면 *iterable나타날 수 있는 위치에 대한 제한 이 완화되어 목록, 설정 및 튜플 리터럴에 배치 할 수있게되었으며 Expression list 의 참조 설명서 도 업데이트되었습니다.


list(newdict)함수 호출이 실제로 수행되지 않기 때문에 (적어도 작은 사전의 경우) 더 빠르다는 차이점과 동일하지만 :

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

더 큰 사전을 사용하면 속도는 거의 동일합니다 (큰 컬렉션을 반복하는 오버 헤드는 함수 호출의 작은 비용보다 우선합니다).


비슷한 방식으로 튜플과 사전 키 세트를 만들 수 있습니다.

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

튜플 케이스에서 후행 쉼표를 조심하십시오!


좋은 설명,하지만 당신은 구문이 "* newdict"유형을 설명 어떤 링크를 참조 할 수 있습니다 제발, 내 말은 어떻게 그리고 왜 단지 understanding.Thanx에 대한 사전에서이 반환 키
무하마드 Younus

1
그 구문은 함수에서 심지어 파이썬 2에서, 꽤 오랫동안 사용할 수있다 @MYounas 당신이 할 수있는 호출 def foo(*args): print(args)다음에 foo(*{1:0, 2:0})결과가 함께 (1, 2)인쇄된다. 이 동작은 참조 매뉴얼 의 통화 섹션에 지정되어 있습니다. PEP 448을 사용하는 Python 3.5는 [*{1:0, 2:0}]이제 사용할 수있는 위치에 대한 제한을 완화했습니다 . 어느 쪽이든, 나는 대답을 편집하고 이것들을 포함시킬 것이다.
Dimitris Fasarakis Hilliard

1
*newdict-이것은 분명히 코드 골퍼들에게 해답입니다 .P. 또한 : 정직하게 말해서, 당신이 정말로 걱정 해야하는 것이 아닙니다. 그렇다면 파이썬을 사용하지 마십시오 .
Artemis는 여전히

46

list(newdict)Python 2와 Python 3에서 작동하여에 간단한 키 목록을 제공합니다 newdict. keys()필요하지 않습니다. (:


26

"덩어리 타이핑"정의에서 약간 벗어나면 dict.keys()목록과 같은 객체가 아니라 반복 가능한 객체를 반환합니다. iterable이 작동하는 곳이라면 어디에서나 작동합니다. 리스트는 또한 iterable이지만 iterable은리스트 (또는 시퀀스 ...)가 아니다

실제 사용 사례에서 dict의 키와 관련하여 가장 일반적인 것은 해당 키를 반복하는 것이므로 이것이 의미가 있습니다. 그리고 당신이 그들을 목록으로 필요로하는 경우에 전화 할 수 있습니다 list().

zip()대부분의 경우 반복적으로 매우 유사합니다. 왜 그것을 통해 반복하고 다시 버릴 수 있도록 완전히 새로운 튜플 목록을 작성합니까?

이것은 파이썬이 목록 전체를 복사하는 것보다 더 많은 반복자 (및 생성기)를 사용하는 큰 트렌드의 일부입니다.

dict.keys() 그래도 이해력이 있어야합니다-오타 또는 무언가를주의 깊게 확인하십시오 ...

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

2
당신은 사용할 필요가 없습니다 .keys(); 사전 객체 자체 는 반복 가능하며 다음을 반복 할 때 키를 생성합니다 [key.split(", ") for key in d].
Martijn Pieters

25

당신은 또한 목록 이해를 사용할 수 있습니다 :

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

또는 짧게

>>> [k  for  k in  newdict]
[1, 2, 3]

참고 : 3.7 이하 버전에서는 순서가 보장되지 않습니다 (순서는 CPython 3.6을 사용한 구현 세부 사항 일뿐입니다).


6
그냥 사용하십시오 list(newdict). 여기에는 목록 이해가 필요하지 않습니다.
Martijn Pieters

8

keys메소드 를 사용하지 않고 목록으로 변환 하면 더 읽기 쉽습니다.

list(newdict)

사전을 반복 할 때 keys()다음이 필요하지 않습니다 .

for key in newdict:
    print key

미리 만든 키 목록이 필요한 루프 내에서 수정하지 않는 한 :

for key in list(newdict):
    del newdict[key]

Python 2에서는을 사용하여 약간의 성능 향상이keys() 있습니다.


8

키를 별도로 저장 해야하는 경우 Extended Iterable Unpacking (python3.x +)을 사용하여 지금까지 제시 된 다른 모든 솔루션보다 타이핑이 덜 필요한 솔루션이 있습니다.

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

            ╒═══════════════╤═════════════════════════════════════════╕
             k = list(d)      9 characters (excluding whitespace)   
            ├───────────────┼─────────────────────────────────────────┤
             k = [*d]         6 characters                          
            ├───────────────┼─────────────────────────────────────────┤
             *k, = d          5 characters                          
            ╘═══════════════╧═════════════════════════════════════════╛

1
내가 지적한 유일한 사소한 경고 k는 항상 여기에있는 목록이라는 것입니다. 사용자가 튜플을 원하거나 키에서 설정하려면 다른 옵션으로 폴백해야합니다.
Dimitris Fasarakis Hilliard

1
더 주목할만한 노트 성명으로, 사실이다 *k, = d가 나타납니다 (그러나보고, 어쩌면이 대답을 업데이트 할 수있는 위치에 대한 제한이, PEP 572 - 확장 풀기는 기압 할당 식을 지원하지 않습니다 하지만 그것은 언젠가 수 있습니다! )
Dimitris Fasarakis Hilliard

키와 값을 모두 나열하려면 어떻게해야합니까?
endolith

1
@endolith (아마도 keys, vals = zip(*d.items())두 튜플을 제공하지만 충분히 가깝습니다). 나는 이것보다 짧은 표현을 모른다.
cs95

1

사전에서 키를 추출 할 수있는 두 가지 방법을 생각할 수 있습니다.

방법 1 :- .keys () 메서드를 사용하여 키를 가져온 다음 목록으로 변환합니다.

some_dict = {1: 'one', 2: 'two', 3: 'three'}
list_of_keys = list(some_dict.keys())
print(list_of_keys)
-->[1,2,3]

방법 2 :- 빈 목록을 만든 다음 루프를 통해 목록에 키를 추가합니다. 이 루프로 값을 얻을 수도 있습니다 (키에만 .keys ()를 사용하고 키와 값 추출에 .items ()를 사용하십시오)

list_of_keys = []
list_of_values = []
for key,val in some_dict.items():
    list_of_keys.append(key)
    list_of_values.append(val)

print(list_of_keys)
-->[1,2,3]

print(list_of_values)
-->['one','two','three']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.