我试图使用列表理解来改变列表的值我可以通过使用3个列表推导来做到这一点
clr = [1,2,2,1,3,1,2,3]
clr= ["green" if i== 1 else i for i in clr]
clr = ["yellow" if i==2 else i for i in clr]
clr = ["black" if i == 3 else i for i in clr]
使用下面提到的代码抛出语法错误
clr = ["green" if i== 1 else "yellow" if i==2 else "black" if i == 3 for i in clr]
有没有更好的方法呢?
答案 0 :(得分:4)
是。例如,您可以定义字典:
the_dic = { 1 : 'green', 2 : 'yellow', 3 : 'black' }
然后执行映射,如:
clr = [the_dic.get(i,i) for i in clr]
或者使用map(..)
(在python-3.x中,这可以作为生成器(因此懒得):
clr = map(the_dic.get,clr)
如果None
中的元素不在字典中,这将插入clr
。
如果字典中的不是,这会将i
添加到clr
列表中。这是因为我们使用the_dic.get(i,i)
。第一个i
是我们在字典中查找的键。第二个i
是“后备”值:如果找不到密钥,我们返回的值。
如果你想过滤掉这些,你可以使用:
clr = [the_dic[i] for i in clr if i in the_dic]
答案 1 :(得分:0)
colors = collections.defaultdict(int,{ 1:'green', 2:'yellow', 3:'black' })
clr = [ colors[i] for i in clr ]
如果重要的是不将无关的0放在输出中,则可以将if 1 <= i <= 3 condition
添加到列表推导中。在这种情况下,您可以使用普通的dict而不是defaultdict。
答案 2 :(得分:0)
您实际上可以在列表理解中执行此操作:
[("green" if i == 1 else ("yellow" if i == 2 else "black")) for i in clr]
如果您想跳过既不是1,2或3的值:
[("green" if i == 1 else ("yellow" if i == 2 else "black")) for i in clr if i in range(1, 4)]
如果你想保留不在[1,2,3]中的值,请执行以下操作:
[("green" if i == 1 else ("yellow" if i == 2 else ("black" if i == 3 else i))) for i in clr]