在Python列表中,如何将一个值的所有实例映射到另一个值?
例如,假设我有这个列表:
x = [1, 3, 3, 2, 3, 1, 2]
现在,也许我想将所有1
更改为'a'
,将所有2
更改为'b'
,并将所有{{}更改为3
1}}到'c'
,创建另一个列表:
y = ['a', 'c', 'c', 'b', 'c', 'a', 'b']
如何优雅地进行此映射?
答案 0 :(得分:7)
您应该使用字典和list comprehension:
>>> x = [1, 3, 3, 2, 3, 1, 2]
>>> d = {1: 'a', 2: 'b', 3: 'c'}
>>> [d[i] for i in x]
['a', 'c', 'c', 'b', 'c', 'a', 'b']
>>>
>>> x = [True, False, True, True, False]
>>> d = {True: 'a', False: 'b'}
>>> [d[i] for i in x]
['a', 'b', 'a', 'a', 'b']
>>>
字典用作转换成什么内容的转换表。
答案 1 :(得分:3)
另一种解决方案是使用将函数应用于列表的内置函数map
:
>>> x = [1, 3, 3, 2, 3, 1, 2]
>>> subs = {1: 'a', 2: 'b', 3: 'c'}
>>> list(map(subs.get, x)) # list() not needed in Python 2
['a', 'c', 'c', 'b', 'c', 'a', 'b']
此处dict.get
方法已应用于列表x
,并且每个号码都与subs
中的相应字母进行了交换。
答案 2 :(得分:2)
In [255]: x = [1, 3, 3, 2, 3, 1, 2]
In [256]: y = ['a', 'c', 'c', 'b', 'c', 'a', 'b']
In [257]: [dict(zip(x,y))[i] for i in x]
Out[257]: ['a', 'c', 'c', 'b', 'c', 'a', 'b']