programing

사전 값을 여러 개 가져오는 방법?

cafebook 2023. 7. 17. 21:25
반응형

사전 값을 여러 개 가져오는 방법?

저는 파이썬으로 된 사전을 가지고 있는데, 제가 하고 싶은 것은 목록으로 몇 가지 값을 얻는 것입니다. 하지만 이것이 구현에서 지원되는지는 모르겠습니다.

myDictionary.get('firstKey')   # works fine

myDictionary.get('firstKey','secondKey')
# gives me a KeyError -> OK, get is not defined for multiple keys
myDictionary['firstKey','secondKey']   # doesn't work either

제가 이것을 이룰 수 있는 방법이 있을까요?제 예에서는 쉬워 보이지만, 20개 항목의 사전이 있고 키 5개를 원한다고 가정해 보겠습니다.다음을 수행하는 것 외에 다른 방법이 있습니까?

myDictionary.get('firstKey')
myDictionary.get('secondKey')
myDictionary.get('thirdKey')
myDictionary.get('fourthKey')
myDictionary.get('fifthKey')

이에 대한 함수가 이미 있습니다.

from operator import itemgetter

my_dict = {x: x**2 for x in range(10)}

itemgetter(1, 3, 2, 5)(my_dict)
#>>> (1, 9, 4, 25)

itemgetter둘 이상의 인수가 전달되면 튜플을 반환합니다.목록 전달하기itemgetter,사용하다

itemgetter(*wanted_keys)(my_dict)

명심하세요itemgetter에서는 키가 하나만 요청된 경우 출력을 튜플로 래핑하지 않으며, 요청된 0개의 키를 지원하지 않습니다.

사용for루프:

keys = ['firstKey', 'secondKey', 'thirdKey']
for key in keys:
    myDictionary.get(key)

또는 목록 이해:

[myDictionary.get(key) for key in keys]

저는 매우 유용한 것을 제안합니다.map함수를 사용하면 함수가 목록에서 요소별로 작동할 수 있습니다.

mydictionary = {'a': 'apple', 'b': 'bear', 'c': 'castle'}
keys = ['b', 'c']

values = list( map(mydictionary.get, keys) )

# values = ['bear', 'castle']

사용할 수 있습니다.At pydash에서:

from pydash import at
my_dict = {'a': 1, 'b': 2, 'c': 3}
my_list = at(my_dict, 'a', 'b')
my_list == [1, 2]

여기에는 유사한 답변이 없으므로 (리스트/제너레이터) 이해를 사용하여 여러 값을 풀고 코드 한 줄로 여러 변수에 할당할 수 있습니다.

first_val, second_val = (myDict.get(key) for key in [first_key, second_key])

목록 이해는 추가 수입이 필요 없는 가장 깨끗한 방법 중 하나라고 생각합니다.

>>> d={"foo": 1, "bar": 2, "baz": 3}
>>> a = [d.get(k) for k in ["foo", "bar", "baz"]]
>>> a
[1, 2, 3]

또는 값을 개별 변수로 사용하려면 다중 할당을 사용합니다.

>>> a,b,c = [d.get(k) for k in ["foo", "bar", "baz"]]
>>> a,b,c
(1, 2, 3)

%timeit위에 나열된 모든 답변에 대한 응답.해결책 중 일부를 놓쳤다면 죄송합니다. 그리고 저는 판단력을 이용하여 비슷한 답변을 구했습니다. itemgetter제겐 승자인 것 같습니다. pydash보고하는 시간은 훨씬 적지만 왜 루프가 더 적게 실행되는지도 모르겠고 가장 빠르게 부를 수 있을지도 모르겠습니다.당신의 생각은?

from operator import itemgetter

my_dict = {x: x**2 for x in range(10)}
req_keys = [1, 3, 2, 5]
%timeit itemgetter(1, 3, 2, 5)(my_dict)
257 ns ± 4.61 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit [my_dict.get(key) for key in req_keys]
604 ns ± 6.94 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


%timeit list( map(my_dict.get, req_keys) )
529 ns ± 34.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


!pip install pydash
from pydash import at

%timeit at(my_dict, 1, 3, 2, 5)
22.2 µs ± 572 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)


%timeit (my_dict.get(key) for key in req_keys)
308 ns ± 6.53 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

s = pd.Series(my_dict)

%timeit s[req_keys]
334 µs ± 58.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

가지고 계신다면,pandas키를 인덱스로 사용하여 시리즈로 만들 수 있습니다.그래서 뭐 그런 거.

import pandas as pd

s = pd.Series(my_dict)

s[['key1', 'key3', 'key2']]
def get_all_values(nested_dictionary):
    for key, value in nested_dictionary.items():
        if type(value) is dict:
            get_all_values(value)
        else:
            print(key, ":", value)

nested_dictionary = {'ResponseCode': 200, 'Data': {'256': {'StartDate': '2022-02-07', 'EndDate': '2022-02-27', 'IsStoreClose': False, 'StoreTypeMsg': 'Manual Processing Stopped', 'is_sync': False}}}

get_all_values(nested_dictionary)

키에 대한 값 매핑을 유지하려면 대신 딕트 이해를 사용해야 합니다.

{key: myDictionary[key] for key in [
  'firstKey',
  'secondKey',
  'thirdKey',
  'fourthKey',
  'fifthKey'
]}

리스트 이해 접근법의 약간 다른 변형.

#doc
[dict[key] for key in (tuple_of_searched_keys)]

#example
my_dict = {x: x**2 for x in range(10)}
print([my_dict[key] for key in (8,9)])

폴백 키가 너무 많지 않으면 다음과 같은 작업을 수행할 수 있습니다.

value = my_dict.get('first_key') or my_dict.get('second_key')
def get_all_values(nested_dictionary):
    for key, val in nested_dictionary.items():
        data_list = []
        if type(val) is dict:
            for key1, val1 in val.items():
                data_list.append(val1)

    return data_list

언급URL : https://stackoverflow.com/questions/24204087/how-to-get-multiple-dictionary-values

반응형