사전에서 첫 번째 키를 어떻게 찾습니까?


203

"banana"사전에서 프로그램을 인쇄하려고합니다 . 가장 간단한 방법은 무엇입니까?

이것은 내 사전입니다.

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
파이썬의 사전은 순서가 없으므로 "첫 번째 키"는 없습니다. 여기를보십시오
David Robinson

2
문자 그대로 "banana"또는 "banana"와 관련된 값 (이 경우 4)을 인쇄 하시겠습니까?
Paul H

to print out banana with a FOR loop, so when I run it, each key would also be printed out당신은 의미 for k in prices: print k합니까? 사전의 모든 키를 인쇄합니다.
David Robinson


8
첫 번째 의견 : 파이썬 3.6 이상에서 사전이 주문됩니다 ( stackoverflow.com/questions/39980323/… 참조 )
Egirus Ornila

답변:


289

dicts가 실제로 주문 된 Python 버전에서 할 수 있습니다

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

dicts를 주문하려면 Python 3.6에 dicts의 기술적-구현 세부 정보 순서 특성에 의존하는 경우 Python 3.7 이상 또는 3.6 이상이 필요합니다.

이전 파이썬 버전에서는 "첫 번째 키"가 없습니다.


31
파이썬 3에서 키와 가치를 모두 원한다면next(iter( my_dict.items() ))
Jonathan H

@RyanHaining Python dicts는 CPython 3.6으로 시작하는 삽입과 Python 3.7로 시작하는 다른 Python 구현으로 정렬됩니다.
Boris

1
이 답변은 중단 점에 도달하기 위해 6 시간 동안 기다린 디버깅 세션을 망쳤습니다. 이것은 매우 괴롭습니다.
마이클

133

사전은 색인화되지 않지만 어떤 방식으로 정렬됩니다. 다음은 첫 번째 기존 키를 제공합니다.

list(my_dict.keys())[0]

26
list(my_dict)[0]어쨌든 키 목록을 검색하기 때문에 쉽게 넣을 수 있습니까?
Jean-Francois T.

@ Jean-FrancoisT. 예
Ryan Haining

사전은 이제 파이썬 3.7로 시작 CPython의 3.6 다른 모든 파이썬 구현에 정렬
보리스

53

업데이트 : Python 3.7부터 삽입 순서가 유지되므로 OrderedDict여기 가 필요하지 않습니다 . 아래 방법을 정상으로 사용할 수 있습니다dict

버전 3.7으로 변경 : 사전 순서는 삽입 순서로 보장됩니다. 이 동작은 3.6의 CPython에 대한 구현 세부 사항입니다.

출처


파이썬 3.6 및 이전 버전 *

일반에 대해 이야기하는 dict경우 "첫 번째 키"는 아무 의미가 없습니다. 키는 어떤 방식 으로든 주문할 수 없습니다. 당신이 당신의 반복을 반복 dict하면 당신은 "banana"당신이 보는 첫 번째로 얻을 수 없을 것 입니다.

사물을 순서대로 보관해야하는 경우 OrderedDict단순한 사전이 아니라을 사용해야합니다 .

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

그런 다음 모든 키 를 순서대로보고 싶다면 키 반복하여 수행 할 수 있습니다

for k in prices:
    print(k)

또는 모든 키를 목록에 넣은 다음 해당 키로 작업 할 수 있습니다

ks = list(prices)
print(ks[0]) # will print "banana"

목록을 만들지 않고 첫 번째 요소 를 얻는 가장 빠른 방법 next은 반복자 를 호출 하는 것입니다. nth그래도 요소 를 얻으려고 할 때 잘 일반화되지는 않습니다.

>>> next(iter(prices))
'banana'

CPython은 3.6의 구현 세부 사항으로 삽입 순서를 보장했습니다.


충고 감사합니다. 더 명확하지 않은 것이 유감입니다. 난 그냥 그와 관련된 값이 아닌 "바나나"를 인쇄 할 수있는 코드를 찾으려고 노력하고 있습니다. 모든 의견을 보내 주셔서 감사합니다!
slagoy

33

아래의 Python 3의 경우 목록 변환 오버 헤드가 제거됩니다.

first = next(iter(prices.values()))

10

dict유형은이다 정렬되지 않은 , 그래서 "첫번째"요소 같은 건 없다, 매핑.

아마 당신이 원하는 것입니다 collections.OrderedDict.


또는 아마도 불변 인 경우 명명 된 튜플
Joran Beasley

이것은 Python 3.6부터 변경되었습니다. 사전이 주문되었습니다.
misantroop

1
기술적으로, 사전 키의 첫 번째 요소가 확실하다면 하나의 키만 필요합니다.
DBX12

고정 된 경우 dict을 반복하면서 첫 번째 항목을 말할 수 있습니다. 그러나 행운을 빌어 그 것을 알아냅니다.
demongolem

6

그래서 알려진 길이 1의 사전에서 유일한 키를 가져 와서 키만 반환하는 것을 최적화하려고 하면서이 페이지를 찾았습니다. 아래 프로세스는 700 크기까지 시도한 모든 사전에 가장 빠릅니다.

7 가지 접근 방식을 시도했지만 2014 3.6 Macbook에서 Python 3.6을 사용하는 것이 가장 좋습니다.

def first_5():
    for key in biased_dict:
        return key

프로파일 링 결과는 다음과 같습니다.

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

내가 시도한 모든 접근법은 다음과 같습니다.

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
따라서 for 루프를 수행하고 첫 번째 키 (first_5)를 반환하는 것이 실제로 가장 빠른 것입니까? 또한 다른 접근 방식에 대한 훌륭한 비교.
PiMathCLanguage

1
네, 가장 빠르지는 않지만 국가 마일로 가장 빠릅니다. 또한 가장 읽기 쉽고 편리합니다.
turiyag

4

간단하게도 나와 같은 대답은

first = list(prices)[0]

사전을 목록으로 변환하면 키가 출력되고 목록에서 첫 번째 키를 선택합니다.


python3의 경우 첫 번째 요소 만 검색하기 위해 완전히 새로운 목록을 만들 필요가 없습니다. next(iter(prices))다른 답변에서 이미 제안한 것처럼 더 잘 사용하십시오 .
normanius

1

다른 많은 사람들이 지적했듯이 사전에는 첫 번째 값이 없습니다. 그것들의 정렬은 임의적이며 사전에 액세스 할 때마다 정렬이 동일하다고 생각할 수 없습니다. 그러나 키를 인쇄하려면 몇 가지 방법이 있습니다.

for key, value in prices.items():
    print(key)

이 방법은 튜플 할당을 사용하여 키와 값에 액세스합니다. 어떤 이유로 키와 값에 모두 액세스해야하는 경우에 편리합니다.

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

이것은 keys()방법이 암시하는 것처럼 키에 대한 액세스 만 제공 합니다.


1

d.keys () [0] 개별 키를 가져옵니다.

업데이트 :-@ AlejoBernardin, 왜 작동하지 않는다고 말했는지 잘 모르겠습니다. 여기에서 확인하고 작동했습니다. 컬렉션 가져 오기

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'바나나'


투표 수에 따라 왜 이것이 최선의 해결책이 아닌가?
GuSuku

18
이것은 python2에서는 작동하지만 python3에서는 작동하지 않습니다. python3에서 인덱싱을 지원하지 않는 대신을 dict.keys()반환 합니다. 'dict_keys' objectlist
mavix

TypeError : 'dict_keys'객체는 인덱싱을 지원하지 않습니다
anilbey

0

다음의 모든 키를 포괄하는 for 루프를 사용하십시오 prices.

for key, value in prices.items():
     print key
     print "price: %s" %value

당신이 변경 확인 prices.items()prices.iteritems()파이썬 2.x에서를 사용하는 경우


0

사전의 첫 번째 키를 원한다면 많은 사람들이 이전에 제안한 것을 사용해야합니다.

first = next(iter(prices))

그러나 첫 번째를 원하고 나머지를 목록으로 유지하려면 값 압축 풀기 연산자를 사용할 수 있습니다

first, *rest = prices

키와 값으로 대체 prices하여 값에 적용 prices.values()할 수 있으며 포장 풀기 할당을 사용할 수도 있습니다.

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

참고 :first, *_ = prices 첫 번째 키를 얻는 데 사용 하려는 유혹이있을 수 있지만 사전은 모든 키를 반복하고 목록을 작성하는 데 약간의 오버 헤드가 있기 때문에 사전이 매우 짧은 경우가 아니라면 일반적 으로이 사용법에 대해 조언 rest합니다.

참고 : 다른 사람들이 언급했듯이 삽입 순서는 python 3.7 (또는 기술적으로 3.6) 이상에서 유지되는 반면 이전 구현은 정의되지 않은 순서로 간주해야합니다.


-3

가장 쉬운 방법은 다음과 같습니다.

first_key = my_dict.keys()[0]

그러나 때로는 더 조심해야하고 당신의 실체가 귀중한 목록임을 확신해야합니다.

first_key = list(my_dict.keys())[0]

3
그것은 TypeError: 'dict_keys' object is not subscriptable적어도 파이썬 3.8에서 발생합니다
Eerik Sven Puudist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.