for循环内联python中的if else语句

时间:2018-11-01 16:10:09

标签: python

我正在运行以下代码,但是遇到错误:

name_map = dict(zip(face_names,
                    [e+'.png' for e in 
                        [face_names[0]+(label.split()[0])]
                            if label=='suit' 
                            elif label != 'suit' face_names

我的错误:

SyntaxError: invalid syntax

从“ elif”开始,失败。

我要...如果label =='suit'

name_map={'john':'johnsuit.png''}

否则

name_map={'john':'john.png'}

2 个答案:

答案 0 :(得分:0)

尝试或改用始终将独立的布尔术语括在方括号中。这有效:

l = [1,2,3]
[x for x in l if (x == 2) or (x == 1)]

答案 1 :(得分:0)

name_map = dict(zip(face_names,
                    [e+'.png' for e in 
                        [face_names[0]+(label.split()[0])]
                            if label=='suit' 
                            elif label != 'suit' face_names
  1. 您还没有关闭这么许多构造函数:dict理解,zip函数和列表理解(zip的第二个参数)是全部仍然打开。
  2. 您的三元运算符(内联if)是非法的:查找语法;除其他外,elif并非此类表达式的一部分。

让我们看看我是否理解这一点:如果标签为“ suit”,则您要构造一个文件名;如果不是,您只想使用face_names作为文件名。然后,我们来写那部分:

[face_names[0] + label.split()[0]] if label == "suit"
    else face_names

是您编写时的表情。在您的整个语句中,这可能变成

name_map = dict(zip(face_names,
                      [e+'.png' for e in 
                          [ face_names[0] + label.split()[0] ]
                      ] if label == "suit"
                        else face_names
                    )
               )

因此,如果标签==“ suit”,您将在第二个列表中获得一个单个元素;否则,该参数是face_names的列表,每个列表后面都附加“ .png”。 如果这不是您想要的,请适当更新发布内容。


根据OP评论更新

似乎您的问题是是否在每个文件名的末尾添加“ suit”。在这种情况下,逻辑要简单得多:

face_names = ["john"]
label = "suit"

name_map = dict(zip(face_names,
                      [e + ('suit.png' if label=="suit" else ".png")
                          for e in face_names]
                    )
               )

print(name_map)

这将产生:

{'john': 'johnsuit.png'}

如果我将标签更改为"not_a_suit",我们将得到

{'john': 'john.png'}