多列表理解为单列表理解

时间:2017-07-13 21:44:48

标签: python list list-comprehension

我试图使用列表理解来改变列表的值我可以通过使用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]

有没有更好的方法呢?

3 个答案:

答案 0 :(得分:4)

是。例如,您可以定义字典

the_dic = { 1 : 'green', 2 : 'yellow', 3 : 'black' }

然后执行映射,如:

clr = [the_dic.get(i,i) for i in clr]

或者使用map(..)(在中,这可以作为生成器(因此懒得):

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]