将字典值映射到列表中

88
给定以下字典:
dct = {'a':3, 'b':3,'c':5,'d':3}

我如何将这些值应用到像以下列表这样的列表中:

lst = ['c', 'd', 'a', 'b', 'd']
为了得到像这样的东西:
lstval = [5, 3, 3, 3, 3]

10
如果列表中的值在字典中不存在,会发生什么? - Anand S Kumar
2
可能是Python字典:获取键列表的值列表的重复问题。 - user
3
如果你对所有这些未经解释的负评背后的原因感到好奇,那么需要说明的是,你的问题被从meta链接过来了:http://meta.stackoverflow.com/questions/308731/failing-first-post-review-trivial-question-with-no-research-had-15 - user000001
9个回答

116
使用列表推导式:

使用列表推导式

>>> [dct[k] for k in lst]
[5, 3, 3, 3, 3]

使用 map 函数:

>>> [*map(dct.get, lst)]
[5, 3, 3, 3, 3]

2
这似乎是使用map的最佳方法,你不需要lambda。 - Anand S Kumar
34
值得注意的是,在Python 3.x中,您需要键入 list(map(dct.get, lst)) 才能获得实际的结果,否则您将获得一个迭代器对象。请注意不要改变原意。 - Leb

18
你可以使用列表推导式来实现这个功能:
lstval = [ dct.get(k, your_fav_default) for k in lst ]

我个人建议使用列表推导式而不是内置的map,因为它对所有Python程序员来说都更加熟悉,更容易解析和扩展,以防需要自定义默认值。


为什么要使用列表推导式而不是map函数?尤其棘手的是,当使用map()函数来执行函数的副作用时,正确的转换方式是使用普通的for循环(因为创建一个列表只会浪费资源)。 :) - Bhargav Rao
@Oleg:这就是为什么我使用了dct.get(k, your_fav_default)。如果值缺失,它应该返回your_fav_default - Sanjay T. Sharma

15
你可以使用 map 函数迭代列表中的键:
lstval = list(map(dct.get, lst))

或者如果你更喜欢列表推导式:

lstval = [dct[key] for key in lst]

8
lstval = [d[x] for x in lst]

不要将你的字典命名为dictdict是类型的名称。

4

不要使用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]

4

我会使用列表推导式:

listval = [dict.get(key, 0) for key in lst]
< p > .get(key, 0) 部分用于在 dict 中没有该键对应的元素时返回一个默认值(在本例中为0)。


@Oleg 该代码正在迭代lst中的元素而不是字典中的键。因此,在字典中可能没有相应的键与lst中的元素相对应(即使这并不合理),我们需要处理这种情况。 - TobiMarg
使用 listval = [dic_rev.get(key, key) for key in y] 来返回在你想要使用的字典中没有出现为键的原始值。 - Alvaro Romero Diaz

2

Python 3 文档中的说明:

因此,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)

1

将字典值映射到嵌套列表

这个问题已经被许多人回答过了。然而,没有人提到过如果列表是嵌套的解决方案。

通过将原始问题中的列表更改为列表的列表

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]]

1

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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接