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

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 에서 목록을 반환하는 더 좋은 방법이 있습니까?



답변

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

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

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

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

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


답변

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}

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


답변

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


답변

“덩어리 타이핑”정의에서 약간 벗어나면 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']]


답변

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

>>> 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을 사용한 구현 세부 사항 일뿐입니다).


답변

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

list(newdict)

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

for key in newdict:
    print key

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

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

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


답변

키를 별도로 저장 해야하는 경우 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                          
            ╘═══════════════╧═════════════════════════════════════════╛