IT story

Python에서 사전의 임의 요소에 액세스

hot-time 2020. 12. 23. 07:33
반응형

Python에서 사전의 임의 요소에 액세스


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

mydict[mydict.keys()[0]]

이 작업을 수행하는 더 좋은 방법이 있습니까?


Python 3에서 비파괴적이고 반복적으로 :

next(iter(mydict.values()))

Python 2에서 비파괴적이고 반복적으로 :

mydict.itervalues().next()

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

six.next(six.itervalues(mydict))

이 시점에서 그것은 매우 비밀스럽고 차라리 귀하의 코드를 선호합니다.

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

key, value = mydict.popitem()

여기서 "첫 번째"는 적절한 용어가 아닙니다. 이것은 dict주문 된 유형이 아니기 때문에 "모든"항목 입니다.


하나의 요소에만 액세스해야하는 경우 (우연히 첫 번째 요소가 됨) 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

(내가 아는 한) Python은 이러한 메소드 중 하나에 대한 두 번의 연속 호출이 동일한 순서로 목록을 반환한다고 보장하지 않습니다. 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

python3에서 방법 :

dict.keys() 

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

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

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

list(dict.keys())[0]

열쇠를 얻으려면

next(iter(mydict))

가치를 얻기 위해

next(iter(mydict.values()))

둘 다 얻으려면

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

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


다른 사람들이 언급했듯이 사전에는 보장 된 순서가 없기 때문에 "첫 번째 항목"이 없습니다 (해시 테이블로 구현 됨). 예를 들어 원하는 경우 가장 작은 키에 해당하는 값 thedict[min(thedict)]이이를 수행합니다. 키가 삽입 된 순서에 관심이 있다면, 즉 "처음"은 "가장 먼저 삽입 됨"을 의미합니다. 그러면 Python 3.1에서 collections.OrderedDict 를 사용할 수 있습니다 . 이는 곧 출시 될 Python 2.7에도 있습니다. 이전 버전의 Python의 경우 여기에서 찾을 수있는 정렬 된 dict 백 포트 (2.4 이상)를 다운로드, 설치 및 사용합니다 .

Python 3.7 이제 딕셔너리가 삽입 순서로 지정됩니다.


이것은 어떤가요. 아직 여기에 언급되지 않았습니다.

py 2 및 3

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

dict 순서와 관련된 문제를 무시하면 더 나을 수 있습니다.

next(dict.itervalues())

이렇게하면 항목 조회를 피하고 사용하지 않는 키 목록을 생성 할 수 있습니다.

Python3

next(iter(dict.values()))

python3에서

list(dict.values())[0]

언제든지 다음을 수행 할 수 있습니다.

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())

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


Python 2 및 3 모두 :

import six

six.next(six.itervalues(d))

python3의 가장 간단한 방법 :

list(dict.keys())[0]

first_key, *rest_keys = mydict

@alldayremix의 의견을 기반으로 @swK의 답변 업데이트 :

Python 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

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

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

aribtrary 키의 경우 .values ​​()를 생략하십시오.

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

Subclassing dict is one method, though not efficient. Here if you supply an integer it will return d[list(d)[n]], otherwise access the dictionary as expected:

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'

ReferenceURL : https://stackoverflow.com/questions/3097866/access-an-arbitrary-element-in-a-dictionary-in-python

반응형