Python中的[] []含义是什么?它是pythonic吗?

时间:2014-02-07 16:26:53

标签: python

我正在阅读一些像这样的Python代码:

import glob
from os.path import *
...
files = glob.glob(prefix + '*') # list out pwd according to some @prefix
res = [f + ['', '/'][isdir(f)] for f in files] # append a `/` to fold

但我们可以更明确地进行追加:

res = [f + '/' for f in files if isdir(f)]

是第二个impl更多 pythonic ?或哪一个更有效?


无论如何,在提出问题之后,我知道原始的impl:

  

对于f中的每个files,如果if是目录,那么isdir将返回True,并且是'/'的索引第一个列表,或Falsef不附加任何内容,f将根据isdir

的返回值附加'/'或''

恕我直言,我认为最初的impl乍一看让新手对[][]感到困惑。

2 个答案:

答案 0 :(得分:2)

如评论中所述,第二种实施方式并不等同。如果谓词为false,那么理解的[,if <filter>]语法会过滤掉所有所包含的元素。

更易读的构造可能是

[f + '/' if isdir(f) else f for f in files]

利用conditional expression代替[a,b][some_boolean]残障。

答案 1 :(得分:1)

您提供的两段代码不执行相同的任务。第一个列出所有匹配的对象,并将/附加到目录。第二个列出了作为目录的所有匹配对象,所有这些对象都附加了/

所以这是一个不合理的事情。在执行不同的任务时,询问哪个更具Pythonic或更高效是没有意义的。

['', '/'][isdir(f)]

Python化?我不确定。在某些人看来,它可能是。我个人觉得很难读。在这个细节层面,很大程度上取决于个人选择。有些人会像这样写代码,有些则不会。你应该遵循自己的直觉。