给定以下字典:
dct = {'a':3, 'b':3,'c':5,'d':3}
我如何将这些值应用到像以下列表这样的列表中:
lst = ['c', 'd', 'a', 'b', 'd']
为了得到像这样的东西:lstval = [5, 3, 3, 3, 3]
dct = {'a':3, 'b':3,'c':5,'d':3}
我如何将这些值应用到像以下列表这样的列表中:
lst = ['c', 'd', 'a', 'b', 'd']
为了得到像这样的东西:lstval = [5, 3, 3, 3, 3]
lstval = [ dct.get(k, your_fav_default) for k in lst ]
我个人建议使用列表推导式而不是内置的map
,因为它对所有Python程序员来说都更加熟悉,更容易解析和扩展,以防需要自定义默认值。
map
函数?尤其棘手的是,当使用map()
函数来执行函数的副作用时,正确的转换方式是使用普通的for循环(因为创建一个列表只会浪费资源)。 :) - Bhargav Raodct.get(k, your_fav_default)
。如果值缺失,它应该返回your_fav_default
。 - Sanjay T. Sharmamap
函数迭代列表中的键:lstval = list(map(dct.get, lst))
或者如果你更喜欢列表推导式:
lstval = [dct[key] for key in lst]
lstval = [d[x] for x in lst]
dict
。 dict
是类型的名称。不要使用dict
作为变量名,因为它是内置的。
>>> d = {'a':3, 'b':3,'c':5,'d':3}
>>> lst = ['c', 'd', 'a', 'b', 'd']
>>> map(lambda x:d.get(x, None), lst)
[5, 3, 3, 3, 3]
我会使用列表推导式:
listval = [dict.get(key, 0) for key in lst]
< p > .get(key, 0)
部分用于在 dict
中没有该键对应的元素时返回一个默认值(在本例中为0)。
lst
中的元素而不是字典中的键。因此,在字典中可能没有相应的键与lst
中的元素相对应(即使这并不合理),我们需要处理这种情况。 - TobiMargPython 3 文档中的说明:
dict.items()
"返回字典键值对 (key, value) 的一个新视图" https://docs.python.org/3/library/stdtypes.html#dict.items zip()
可以与 * 操作符一起用来解压列表" https://docs.python.org/3/library/functions.html#zip因此,zip(*d.items())
将会给出你的结果。
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print(d.items()) # [('a', 1), ('c', 3), ('b', 2), ('d', 4)] in Python 2
# dict_items([('a', 1), ('c', 3), ('b', 2), ('d', 4)]) in Python 3
print(zip(*d.items())) # [('a', 1), ('c', 3), ('b', 2), ('d', 4)] in Python 2
# <zip object at 0x7f1f8713ed40> in Python 3
k, v = zip(*d.items())
print(k) # ('a', 'c', 'b', 'd')
print(v) # (1, 3, 2, 4)
将字典值映射到嵌套列表
这个问题已经被许多人回答过了。然而,没有人提到过如果列表是嵌套的解决方案。
通过将原始问题中的列表更改为列表的列表
dct = {'a': 3, 'b': 3, 'c': 5, 'd': 3}
lst = [['c', 'd'], ['a'], ['b', 'd']]
lstval = [[dct[e] for e in lst[idx]] for idx in range(len(lst))]
# lstval = [[5, 3], [3], [3, 3]]
Anand S Kumar 正确指出,当列表中的某个值在字典中不存在时,您会遇到问题。
另一个更健壮的解决方案是在列表推导式中添加 if/else 条件。通过这样做,您可以确保代码不会崩溃。
这样,您只会更改字典中存在对应键的列表值,否则将保留原始值。
m = {'a':3, 'b':3, 'c':5, 'd':3}
l = ['c', 'd', 'a', 'b', 'd', 'other_value']
l_updated = [m[x] if x in m else x for x in l]
[输出]
[5, 3, 3, 3, 3, 'other_value']