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


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.