我有一个带键的列表,我希望在它们出现时从字典中获取键值。我暂时有一个带有键的列表的函数,但它只返回同一个键的一个匹配项,尽管在列表中多次出现相同的键。
例如[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']
答案 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]