从键列表中获取dict中的所有值,其中相同的键出现很多次

时间:2014-11-25 23:31:15

标签: python list python-2.7 dictionary key

我有一个带键的列表,我希望在它们出现时从字典中获取键值。我暂时有一个带有键的列表的函数,但它只返回同一个键的一个匹配项,尽管在列表中多次出现相同的键。

例如[1,2,3]而不是[1,2,2,2,1,1,3,3]

这是我的代码:

key_list = [1,2,2,2,1,1,3,3]

dict_ = {1:'a', 2:b, 3:'c'}

# current function that only returns one occurence per key in the list with keys, key_list`
def get_values_from_dict(dict_, key_list):
    return [v for k, v in dict_.items() if k in key_list]

这是我的预期输出:

['a', 'b', 'b', 'b', 'a', 'a', 'c', 'c']

3 个答案:

答案 0 :(得分:3)

您的列表理解应该使用dict_中的每个值为key_list编制索引:

>>> key_list = [1,2,2,2,1,1,3,3]
>>> dict_ = {1:'a', 2:'b', 3:'c'}
>>> def get_values_from_dict(dict_, key_list):
...     return [dict_[x] for x in key_list]
...
>>> get_values_from_dict(dict_, key_list)
['a', 'b', 'b', 'b', 'a', 'a', 'c', 'c']
>>>

您当前的代码不正确,因为它正在执行不同的操作:它会使dict_中的所有值都包含key_list中的键。换句话说,它正在按key_list过滤值。

答案 1 :(得分:1)

这已内置于标准库中 - 当您为其提供多个键时itemgetter所执行的操作:

>>> import operator
>>> key_list = [1,2,2,2,1,1,3,3]
>>> dict_ = {1:'a', 2:'b', 3:'c'}
>>> operator.itemgetter(*key_list)(dict)
('a', 'b', 'b', 'b', 'a', 'a', 'c', 'c')

如果你需要一个列表而不是一个元组,只需转换它:

>>> list(operator.itemgetter(*key_list)(dict))
['a', 'b', 'b', 'b', 'a', 'a', 'c', 'c']

来自文档:

  

返回一个可调用对象,该对象使用操作数的__getitem__()方法从其操作数中获取项。如果指定了多个项,则返回一个查找值元组。

关于此问题的一个很酷的事情是,您可以存储itemgetter(key_list)并重复将其应用于不同的词典,或将其作为key函数传递给sort来电等。但如果你不需要任何这些,你可以像我上面那样直接调用它。

文档还向您展示了如何自己编写相同的内容:

tuple(obj[item] for item in items)

在这里,如果你想要一个列表,只需使用列表推导而不是生成器表达式和tuple函数:

[obj[item] for item in items]

答案 2 :(得分:0)

您想要的是输入到输出的一对一映射,使用字典进行转换/映射。因此,您应该在输入列表上迭代而不是在dict项目上。代码如下。

def get_values_from_dict(dict_, key_list):
    return [dict_[k] for k in key_list]