Python 使用if-else的列表理解行为

Python 使用if-else的列表理解行为,python,list-comprehension,Python,List Comprehension,我阅读了大量“pkl”文件,完成了以下列表理解: 这是我让它工作的唯一方法。如果在If不起作用后添加else子句。如果我把If子句放在循环之前,它就不起作用了。你能解释一下原因吗?如果我这样做: a = [pd.read_pickle("my_file"+str(i)+".pkl") if os.path.exists("my_file"+str(i)+".pkl") else print(i) for i in range(1, 18)] 这个不起作用,这与许多关于列表理解的答案相反 谢谢

我阅读了大量“pkl”文件,完成了以下列表理解:

这是我让它工作的唯一方法。如果在If不起作用后添加
else
子句。如果我把
If
子句放在循环之前,它就不起作用了。你能解释一下原因吗?如果我这样做:

a = [pd.read_pickle("my_file"+str(i)+".pkl") if os.path.exists("my_file"+str(i)+".pkl") else print(i) for i in range(1, 18)]
这个不起作用,这与许多关于列表理解的答案相反

谢谢

a = [pd.read_pickle("my_file"+str(i)+".pkl" if os.path.exists("my_file"+str(i)+".pkl") else your_alternate_value for i in range(1, 18)]
或者我更喜欢格式化它,以防止出现这样长的行:

a = [
            pd.read_pickle("my_file"+str(i)+".pkl"
        if os.path.exists("my_file"+str(i)+".pkl")
        else your_alternate_value
    for i in range(1, 18)
]
列表理解对我来说有点难理解如何格式化。也许我更喜欢另一种方式,但我还没有想到

解释 列表理解转换为如下格式

some_list = []
for ...:
    for/if ...
        ...
            ...
            some_list.append(something)
不管你想要多少个街区,但只会越走越深。任何块只能包含另一个块或最终附加值。现在,当你认为列表理解没有缩进时,这是有意义的。如果您有两个
If
块,那么理解如何知道
else
属于哪一个块

我的解决方案的秘密在于它不是另一个街区;这是附加内容的一部分。if/else是一个表达式,与其他语言中的三元运算符相当。下面是发生的事情:

some_list = []
for ...
    some_list.append(something if blah else some_other_thing)

这就是为什么if/else在开头。

(todo1 if condition else todo 2 for item in dataset)
如果要添加
else部分
是的,如果cluases最后一个,如果cluases是solo,如果else在操作之后。有点违反直觉。我编辑问题以显示更多细节。在
if
语句之前,您是否缺少一个结束语
?所以
a=[pd.read\u pickle(“我的文件”+str(i)+“.pkl”)如果os.path.exists…
some_list = []
for ...
    some_list.append(something if blah else some_other_thing)