词典理解中的动态if语句

时间:2013-02-20 11:45:29

标签: python if-statement dictionary-comprehension

我正在使用字典理解来获取键值对的字典,其中键是mp3文件的名称,值是文件的路径。

我做:

for root, dirs, files in os.walk(rootDir, topdown='true'):
    source_files = {filename:root for filename in files if os.path.splitext(filename)[1].lower() == '.mp3'}
    # more code
    # ...
    # ...

我对more code部分中的源文件做了更多逻辑。现在,我想为任何图片重复这个逻辑(即.gif,.jpeg等)

所以我能做到:

for root, dirs, files in os.walk(rootDir, topdown='true'):
    source_files = {filename:root for filename in files if os.path.splitext(filename)[1].lower() == '.jpeg' or os.path.splitext(filename)[1].lower() == '.gif'}

然后将more code部分包装到一个函数中并调用它来获取图片文件。但是,我想知道我是否可以在字典理解中使if表达式动态,然后只传入一个if表达音乐文件和另一个if表达式的图片文件?

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找fnmatch.fnmatch功能,甚至是fnmatch.filter()

from fnmatch import filter

for root, dirs, files in os.walk(rootDir):
    source_files = {filename: root for filename in filter(files, '*.jpg')}

但是,如果您需要匹配多个扩展程序,则使用str.endswith()更容易:

for root, dirs, files in os.walk(rootDir):
    source_files = {filename: root for filename in files if filename.endswith(('.jpg', '.png', '.gif'))}

使用.endswith(),您可以使用任何字符串或扩展元组:

mp3s = '.mp3'
images = ('.jpg', '.png', '.gif')

然后使用:

extensions = images

for root, dirs, files in os.walk(rootDir):
    source_files = {filename: root for filename in files if filename.endswith(extensions)}

我不确定你为什么在这里使用词典理解;循环的每次迭代,root将是常量。你也可以这样做:

for root, dirs, files in os.walk(rootDir):
    source_files = dict.fromkeys(filter(files, '*.jpg'), root)

或使用

for root, dirs, files in os.walk(rootDir):
    source_files = dict.fromkeys([f for f in files if f.endswith(extensions)], root)

如果要在嵌套目录结构中创建所有文件的字典,则需要将字典理解移出并集成{{1}而是在dict理解中调用:

os.walk()

我删除了所有source_files = {filename: root for root, dirs, files in os.walk(rootDir) for filename in files if f.endswith(extensions)} 行;无论如何,默认值为topdown='true'(注意:python booleans是topdown=TrueTrue,而不是字符串。它恰好起作用,因为False字符串是'truthy',它被认为是在布尔上下文中为True,因为它是非空的。)

答案 1 :(得分:0)

这是:

def a_func(extension):
    # some code
    for root, dirs, files in os.walk(rootDir, topdown='true'):
        source_files = {filename:root for filename in files if os.path.splitext(filename)[1].lower() == extension}
        # more code
        # ...
        # ...

符合您的需求?