programing

사전: 키 목록에 대한 값 목록을 가져옵니다.

copysource 2023. 2. 3. 23:21
반응형

사전: 키 목록에 대한 값 목록을 가져옵니다.

사전의 키 목록을 사용하여 해당 항목의 목록을 가져오는 기본 제공/빠른 방법이 있습니까?

예를 들어 다음과 같습니다.

>>> mydict = {'one': 1, 'two': 2, 'three': 3}
>>> mykeys = ['three', 'one']

사용방법mykeys사전에서 해당 값을 목록으로 가져올 수 있습니까?

>>> mydict.WHAT_GOES_HERE(mykeys)
[3, 1]

목록 이해는 이를 위한 좋은 방법인 것 같습니다.

>>> [mydict[x] for x in mykeys]
[3, 1]

list-comp 이외의 몇 가지 방법이 있습니다.

  • 빌드 목록 및 키를 찾을 수 없는 경우 예외 발생:map(mydict.__getitem__, mykeys)
  • 목록 작성:None키를 찾을 수 없는 경우:map(mydict.get, mykeys)

또는,operator.itemgetter는 태플을 반환할 수 있습니다.

from operator import itemgetter
myvalues = itemgetter(*mykeys)(mydict)
# use `list(...)` if list is required

주의: Python3에서는map는 목록이 아닌 반복자를 반환합니다.사용하다list(map(...))목록을 위해.

속도 비교:

Python 2.7.11 |Anaconda 2.4.1 (64-bit)| (default, Dec  7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)] on win32
In[1]: l = [0,1,2,3,2,3,1,2,0]
In[2]: m = {0:10, 1:11, 2:12, 3:13}
In[3]: %timeit [m[_] for _ in l]  # list comprehension
1000000 loops, best of 3: 762 ns per loop
In[4]: %timeit map(lambda _: m[_], l)  # using 'map'
1000000 loops, best of 3: 1.66 µs per loop
In[5]: %timeit list(m[_] for _ in l)  # a generator expression passed to a list constructor.
1000000 loops, best of 3: 1.65 µs per loop
In[6]: %timeit map(m.__getitem__, l)
The slowest run took 4.01 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 853 ns per loop
In[7]: %timeit map(m.get, l)
1000000 loops, best of 3: 908 ns per loop
In[33]: from operator import itemgetter
In[34]: %timeit list(itemgetter(*l)(m))
The slowest run took 9.26 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 739 ns per loop

따라서 목록 이해와 아이템게터가 이를 위한 가장 빠른 방법입니다.

갱신하다

대규모 랜덤 리스트와 맵의 경우 결과는 조금 달랐습니다.

Python 2.7.11 |Anaconda 2.4.1 (64-bit)| (default, Dec  7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)] on win32
In[2]: import numpy.random as nprnd
l = nprnd.randint(1000, size=10000)
m = dict([(_, nprnd.rand()) for _ in range(1000)])
from operator import itemgetter
import operator
f = operator.itemgetter(*l)

%timeit f(m)
1000 loops, best of 3: 1.14 ms per loop

%timeit list(itemgetter(*l)(m))
1000 loops, best of 3: 1.68 ms per loop

%timeit [m[_] for _ in l]  # list comprehension
100 loops, best of 3: 2 ms per loop

%timeit map(m.__getitem__, l)
100 loops, best of 3: 2.05 ms per loop

%timeit list(m[_] for _ in l)  # a generator expression passed to a list constructor.
100 loops, best of 3: 2.19 ms per loop

%timeit map(m.get, l)
100 loops, best of 3: 2.53 ms per loop

%timeit map(lambda _: m[_], l)
100 loops, best of 3: 2.9 ms per loop

이 경우 확실한 승자는f = operator.itemgetter(*l); f(m), 그리고 분명한 외부인:map(lambda _: m[_], l) .

Python 3.6.4 업데이트

import numpy.random as nprnd
l = nprnd.randint(1000, size=10000)
m = dict([(_, nprnd.rand()) for _ in range(1000)])
from operator import itemgetter
import operator
f = operator.itemgetter(*l)

%timeit f(m)
1.66 ms ± 74.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit list(itemgetter(*l)(m))
2.1 ms ± 93.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit [m[_] for _ in l]  # list comprehension
2.58 ms ± 88.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit list(map(m.__getitem__, l))
2.36 ms ± 60.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit list(m[_] for _ in l)  # a generator expression passed to a list constructor.
2.98 ms ± 142 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit list(map(m.get, l))
2.7 ms ± 284 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit list(map(lambda _: m[_], l)
3.14 ms ± 62.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

따라서 Python 3.6.4의 결과는 거의 동일합니다.

세 가지 방법이 있습니다.

기르기KeyError키를 찾을 수 없는 경우:

result = [mapping[k] for k in iterable]

누락된 키의 기본값입니다.

result = [mapping.get(k, default_value) for k in iterable]

누락된 키를 건너뜁니다.

result = [mapping[k] for k in iterable if k in mapping]

시험:

mydict = {'one': 1, 'two': 2, 'three': 3}
mykeys = ['three', 'one','ten']
newList=[mydict[k] for k in mykeys if k in mydict]
print newList
[3, 1]

이것을 시험해 보세요.

mydict = {'one': 1, 'two': 2, 'three': 3}
mykeys = ['three', 'one'] # if there are many keys, use a set

[mydict[k] for k in mykeys]
=> [3, 1]
new_dict = {x: v for x, v in mydict.items() if x in mykeys}

판다는 이것을 매우 우아하게 행하지만, 리스트의 포괄성은 항상 기술적으로 더 피토닉합니다.지금은 속도 비교를 할 시간이 없습니다(나중에 다시 와서 입력하겠습니다).

import pandas as pd
mydict = {'one': 1, 'two': 2, 'three': 3}
mykeys = ['three', 'one']
temp_df = pd.DataFrame().append(mydict)
# You can export DataFrames to a number of formats, using a list here. 
temp_df[mykeys].values[0]
# Returns: array([ 3.,  1.])

# If you want a dict then use this instead:
# temp_df[mykeys].to_dict(orient='records')[0]
# Returns: {'one': 1.0, 'three': 3.0}

Python 종료 후: 주어진 순서로 dict 값에서 목록을 만드는 효율적인 방법

목록을 작성하지 않고 키 가져오기:

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import collections


class DictListProxy(collections.Sequence):
    def __init__(self, klist, kdict, *args, **kwargs):
        super(DictListProxy, self).__init__(*args, **kwargs)
        self.klist = klist
        self.kdict = kdict

    def __len__(self):
        return len(self.klist)

    def __getitem__(self, key):
        return self.kdict[self.klist[key]]


myDict = {'age': 'value1', 'size': 'value2', 'weigth': 'value3'}
order_list = ['age', 'weigth', 'size']

dlp = DictListProxy(order_list, myDict)

print(','.join(dlp))
print()
print(dlp[1])

출력:

value1,value3,value2

value3

리스트에서 지정한 순서와 일치합니다.

reduce(lambda x,y: mydict.get(y) and x.append(mydict[y]) or x, mykeys,[])

dict에 없는 키가 있는 경우.

이 작업을 자주 하는 경우 서브클래스를 사용하는 것이 좋습니다.dict키 목록을 가져와서 값 목록을 반환합니다.

>>> d = MyDict(mydict)
>>> d[mykeys]
[3, 1]

다음은 데모 구현입니다.

class MyDict(dict):
    def __getitem__(self, key):
        getitem = super().__getitem__
        if isinstance(key, list):
            return [getitem(x) for x in key]
        else:
            return getitem(key)

적절한 서브클래싱을 실시하려면 , 한층작업이 필요하게 되어, 실장하고 싶은 경우도 있습니다..get(),.__setitem__(),그리고..__delitem__(),다른 것들 중에.

언급URL : https://stackoverflow.com/questions/18453566/dictionary-get-list-of-values-for-list-of-keys

반응형