在Python中为列表元素赋值

在Python中为列表元素赋值,python,list,Python,List,我有一份清单: A=[x,y,z,x,z,x] 我想将1分配给列表中所有出现的x,2分配给所有出现的y,3分配给所有出现的z。 也就是说,对于所有出现的x,y,z,都是x=1,y,z 做这件事的最短方法是什么?我想这会满足你的要求 try: mapping = {x:1, y:2, z:3} except TypeError: # either x, y, or z is unhashable new_A = [1 if el==x else

我有一份清单:

A=[x,y,z,x,z,x]
我想将1分配给列表中所有出现的
x
,2分配给所有出现的
y
,3分配给所有出现的
z
。 也就是说,对于所有出现的
x
y
z
,都是
x=1
y
z


做这件事的最短方法是什么?

我想这会满足你的要求

try:
    mapping = {x:1, y:2, z:3}
except TypeError:
    # either x, y, or z is unhashable
    new_A = [1 if el==x else
             2 if el==y else
             3 if el==z else 
             el for el in A]
else:
    new_A = [mapping[el] for el in A]
In [10]: A=["x","y","z","x","z","x"]
In [11]: d={"x":1, "y":2, "z":3}
In [12]: B=map(lambda x:d[x], A)
In [13]: B
Out[13]: [1, 2, 3, 1, 3, 1]

为了补偿您拥有不可散列内容的风险,您还可以这样做

A = [x, y, z, x, z, x]
mapping = {id(x):1, id(y):2, id(z):3}
new_A_way1 = [mapping[id(el)] for el in A]
new_A_way2 = map(lambda el: mapping[id(el)], A)

只要对象存在,其他对象就无法获取其
id
,因此这应该是一种安全的方法。

假设
x
y
z
是可散列的,当然。@IgnacioVazquez Abrams!如果
x
y
z
不可散列,我会写一个列表comp。x、y和z字符串文字是“x”、“y”、“z”还是变量名?您想手动指定映射,还是想将1分配给第一个看到的元素,将2分配给下一个元素,依此类推?@icedtrees:好问题。OTOH,我想如果它们是实际的变量名,你只需要做
x,y,z=1,2,3;A=[x,y,z,x,z,x]
:)@PM2Ring我假设它们是我们不想看到的变量change@AdamSmith:啊!我没想到。我想我们得等一等,看看普什卡尔·德拉维德说了些什么……注意,这里没有必要做lambda
B=map(d.get,A)
是等效的。或者
operator.getitem