是否有一种内置/快速的方法来使用字典的键列表来获得对应项的列表?

例如,我有:

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

我如何使用mykeys在字典中作为列表获得相应的值?

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

当前回答

以下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

哪个与列表给出的顺序匹配

其他回答

如果您发现自己经常这样做,您可能希望继承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)

继承dict的子类需要更多的工作,另外你可能想要实现.get(), .__setitem__(), 以及.__delitem__()等。

Pandas非常优雅地做到了这一点,尽管ofc列表理解在技术上总是更加python化。我现在没有时间放一个速度比较(我稍后会回来放):

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}

列表理解似乎是一个很好的方法:

>>> [mydict[x] for x in mykeys]
[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]

试试这个:

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]