파이썬의 사전에서 임의의 요소에 액세스


507

a mydict가 비어 있지 않으면 다음과 같이 임의의 요소에 액세스합니다.

mydict[mydict.keys()[0]]

더 좋은 방법이 있습니까?


3
그가 말한 것 .. 이것은 dict에 오직 하나의 요소가 있거나 당신이 어떤 것을 되 찾는 지 신경 쓰지 않는다면 실제로 유효한 질문입니다.
— royal

5
예, dict의 모든 요소에 액세스해야하므로 첫 번째 요소에 액세스하려고합니다.
— Stan

2
@Stan : 그러나 Greg가 말했듯이 dict에는 명확한 "첫 번째"요소가 없습니다. 그래서 당신은 분명하게하기 위해 질문을 바꿔야 할 것입니다
— tdihp

10
나는 그것이 유효한 질문이라고 생각합니다. 임의의 요소에 액세스해야하고 dict이 비어 있지 않다고 확신하는 경우 항목 수를 알 수 없으므로 "first"를 요청하는 것이 좋습니다.
— kap

7
@MichaelScheper 다음 목록에 캐스트해야합니다 list(mydict.keys())[0].
— Daniel Moskovich

답변:


600

파이썬 3에서는 비파괴 적으로 반복적으로 :

next(iter(mydict.values()))

파이썬 2에서는 비파괴 적으로 반복적으로 :

mydict.itervalues().next()

파이썬 2와 3에서 모두 작동하려면 six패키지를 사용할 수 있습니다 .

six.next(six.itervalues(mydict))

이 시점에서 그것은 매우 비밀스럽고 오히려 코드를 선호합니다.

항목을 제거하려면 다음을 수행하십시오.

key, value = mydict.popitem()

"<first"는 dict파이썬 <3.6에서 정렬 된 타입이 아니기 때문에 여기서는 적절한 용어가 아닐 수도 있습니다 . Python 3.6 이상 dicts이 주문되었습니다.


35
당신은 의미하지 dict.iterkeys().next()않습니까?
— John Machin

12
@ John Machin : 글쎄, 질문은 첫 번째 키와 관련된 가치에 접근하는 것 같습니다. 그래서 그 대답도 있습니다.
— doublep

5
이것은 더 좋아 보인다 : dict.values().__iter__().__next__():)
— Vitaly Zdanevich

17
dict.keys ()는 직접 반복 가능하지 않습니다.
— semiomant

3
비파괴적인 대중을 위해 (얕은) 사본을 만들 수 있습니다 :key, value = dict(d).popitem()
— Pelle

140

하나의 요소에만 액세스 해야하는 경우 (우연히 첫 번째이므로 dicts는 순서를 보장하지 않기 때문에) Python 2 에서 간단히 수행 할 수 있습니다 .

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

(내가 아는 한) 파이썬은 이러한 메소드 중 하나에 대한 두 번의 연속 호출이 동일한 순서로 목록을 반환한다고 보장하지 않습니다. Python3에서는 지원되지 않습니다.

에서 파이썬 3 :

list(my_dict.keys())[0]     -> key of "first" element
list(my_dict.values())[0]   -> value of "first" element
list(my_dict.items())[0]    -> (key, value) tuple of "first" element

90
파이썬 2.x에서만 작동합니다. 3.x에서는 사용해야합니다list(my_dict.keys())[0]
— alldayremix

6
그렇다면이 복잡한 클래스는 무엇입니까? 확실히, list(my_dict.keys())[0]게으른하지?
— Evgeni Sergeev

1
명확히하기 위해 @alldayremix가 해당 주석의 의미는 python 3.x에 있습니다. my_dict.function () 결과는 인덱싱을 지원하지 않으므로 먼저 목록으로 변환해야하며 인덱스를 사용할 수 있습니다. [0]
— 노키

57

python3에서 방법 :

dict.keys() 

dict_keys () 유형의 값을 반환하면 다음과 같이 dict 키의 첫 번째 멤버가있을 때 오류가 발생합니다.

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

마지막으로 dict.keys ()를 @ 1st로 변환하고 list splice 메서드로 첫 번째 멤버를 얻었습니다.

list(dict.keys())[0]

이것은 가장 쉬운 솔루션이며 python2와 python3 모두에서 작동합니다.
— mattmilten

내 돈을 위해 나는이 답변이 가장 직관적이라고 말합니다
— Thomas Valadez

예, 그러나 이것은 OP 질문에 대답하지 않습니다. 키가 아닌 VALUES에 도달하는 방법입니다.
— Mike Williamson

1
@MikeWilliamson 대부분의 독자는 파이썬 딕트에서 키가 주어지면 해당 값을 얻는 방법을 알고 있기를 바랍니다.
— eric oc

5
임의의 키가 아닌 임의의 항목을 얻으려면 유사하게 할 수 있습니다 list(dict.values())[0].
— jhin

24

열쇠를 얻기 위해

next(iter(mydict))

가치를 얻기 위해

next(iter(mydict.values()))

둘 다 얻기

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

처음 2 개는 Python 2와 3입니다. 마지막 2 개는 Python 3에서는 게으르지 만 Python 2에서는 게으르지 않습니다.


16

다른 사람들이 언급했듯이 사전에는 순서가 보장되지 않기 때문에 "첫 번째 항목"이 없습니다 (해시 테이블로 구현 됨). 예를 들어 가장 작은 키에 해당하는 값을 원하면 thedict[min(thedict)]그렇게 할 것입니다. 키가 삽입 된 순서, 즉 "첫 번째"가 "가장 빨리 삽입 됨"을 의미하는 경우 Python 3.1에서는 collections.OrderedDict 를 사용할 수 있습니다 . 이전 버전의 Python의 경우 여기에서 찾을 수있는 정렬 된 dict 백 포트 (2.4 이상)를 다운로드하여 설치하고 사용 하십시오 .

Python 3.7 이제 dicts는 삽입 순서입니다.


11

이건 어때요. 아직 여기에 언급되지 않았습니다.

파이 2 & 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2

5
dict.values()뷰를 반환하므로 O (1)이어야합니다. list(a)새 목록을 반환하므로 O (n)이됩니다.
— boycy

또한 a = { "a": { "1"}}이면 python2에서 작동하지 않는 것 같습니다.
— qasimzee

11

dict 순서와 관련된 문제를 무시하면 더 좋습니다.

next(dict.itervalues())

이런 식으로 항목 조회를 피하고 사용하지 않는 키 목록을 생성합니다.

파이썬 3

next(iter(dict.values()))

2
values ​​()는 모든 값의 사본을 만들며 (키의 경우 keys ()) O (n ^ 2) 많은 연산을 수행합니다.
— Glenn Maynard 2018 년

OPs 버전도 마찬가지입니까? 이터레이터를 사용하도록 변경하겠습니다.
— Matt Joiner

4
이것은 Python 2뿐입니다. Python 3의 next(iter(dict.values()))경우 목록을 만들지 않고 동일한 결과를 가져와야합니다.
— kap


2

당신은 항상 할 수 있습니다 :

for k in sorted(d.keys()):
    print d[k]

이렇게하면 내장 된 것과 관련하여 일관되게 정렬됩니다. 정렬에 의미가있는 경우 처리 할 수있는 키 세트가 .hash () 추측합니다). 예를 들어 사전을 확장하더라도 숫자 유형이 일관되게 정렬됩니다.

예

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

사전은 인쇄시 정렬됩니다. 그러나 키 세트는 본질적으로 해시 맵입니다!


2

파이썬 2와 3 모두

import six

six.next(six.itervalues(d))

이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
— Martin Tournoij

이것은 Is there any better way to do this?짧은 질문 으로 정확하게 대답합니다 .
— oblalex

이 답변은 이미 두 번 주어졌으며 그 중 하나는 거의 5 년 동안이 사이트에있었습니다. 이것은 다른 답변에 대한 의견입니다 (: Python 2 & 3 모두에서 작동하도록 답변을 개선하는 방법 은 다음과 같습니다 ). "새로운"답변은 아닙니다. SO의 검토 시스템은이 경우에 다소 도움이되지 않는 메모를 자동으로 배치했습니다.
— Martin Tournoij

아닙니다. 이 답변을 쓴지 1 시간 후인 17 시간 전에 5 yo 답변에이 변형을 추가했습니다. 이 페이지에서 'six'단어에 'find'를 사용하면이 두 가지 답변에서만 6 개의 일치 항목 만 찾을 수 있습니다. 어쨌든,이 답변은 실제로 당신을 방해합니까? 나는 이것이 다른 사람들에게 도움이 될 것이라고 생각하며 이것은 괜찮습니다. 그래서 거래는 무엇입니까?
— oblalex

IMHO는이 답변이 처음에 해당 게시물을 수정 한 것이기 때문입니다. 편집하지 않으면 사람들이 답을 보려면 여러 페이지를 아래로 스크롤해야합니다. 귀하의 답변과 거의 동일한 고도로 답변 된 답변을 수정하는 것보다 더 유용하다고 생각하십니까?
— Martin Tournoij


-1

외부 라이브러리가 없으며 Python 2.7 및 3.x 모두에서 작동합니다.

>>> list(set({"a":1, "b": 2}.values()))[0]
1

aribtrary 키의 경우 .values ​​()

>>> list(set({"a":1, "b": 2}))[0]
'a'

-2

서브 클래 싱 dict은 효율적이지 않지만 한 가지 방법입니다. 여기에 정수를 제공하면을 반환 d[list(d)[n]]하고 그렇지 않으면 예상대로 사전에 액세스합니다.

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.