首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将嵌套列表理解转换为使用python中的itertools链

将嵌套列表理解转换为使用python中的itertools链
EN

Stack Overflow用户
提问于 2016-02-27 22:40:41
回答 1查看 848关注 0票数 0

Making a flat list out of list of lists in Python讨论的启发,我尝试将其转换为(在some_directory中获取文件和文件夹修改时间):

代码语言:javascript
运行
复制
c = [os.path.getmtime(item) for root, d, files in os.walk(some_directory)
        for item in [root] + map(lambda fi: os.path.join(root, fi), files)]

要使用itertools.chain:

代码语言:javascript
运行
复制
c = map(os.path.getmtime,
        itertools.chain.from_iterable([root] + map(lambda fi: join(root, fi), files)
                                      for root, d, files in os.walk(some_directory)))

但我的分析显示,它速度较慢,而且看起来并不是很优雅。

那么,在这种情况下,我如何使用链,即如何更优雅(更快)地生成中间列表?

或者,对于我的情况,还有其他迭代工具函数吗?

编辑:

散列了一个分析脚本:

代码语言:javascript
运行
复制
import timeit

repeat = 10

setup ="""
import itertools
import os

join = os.path.join
path = r'C:\Dropbox\eclipse_workspaces'
c = []
"""


print "Original             ", min(timeit.Timer("""[c.extend([join(root,dir) for dir in dirs] + [join(root,file) for file in files]) for root,dirs,files in os.walk(path)]""",
                       setup=setup).repeat(3, repeat))
print "For loop             ", min(timeit.Timer("""for root, d, files in os.walk(path):
    c.append(root)
    c.extend(join(root, fi) for fi in files)""",
                       setup=setup).repeat(3, repeat))
print "Comprehension        ", min(timeit.Timer('[item for r, d, f in os.walk(path) for item in [r] + map(lambda f: join(r, f), f)]',
                       setup=setup).repeat(3, repeat))
print "Comprehension + chain", min(timeit.Timer('[item for r, d, f in os.walk(path) for item in itertools.chain.from_iterable(([r], map(lambda fi: join(r, fi), f)))]',
                       setup=setup).repeat(3, repeat))
print "Itertools            ", min(timeit.Timer("""[j for j in itertools.chain.from_iterable([root] + map(lambda fi: join(root, fi), files)
                                      for root, d, files in os.walk(path))]""",
                       setup=setup).repeat(3, repeat))

似乎没有区别,但我有一些奇怪的工件时,分析,所以我没有发布任何结果。我仍然对最快的方法感兴趣,最好是使用迭代工具。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-27 22:53:20

我认为在这里使用chain是没有意义的。chain是最有用的,当扁平是它所取代的理解的全部要点时。如果你在做更复杂的事情,那么坚持理解或生成表达式可能就更容易了。甚至可以将结构解压缩到显式for循环中,这样就可以避免当前代码中的列表连接:

代码语言:javascript
运行
复制
c = []
for root, d, files in os.walk(some_directory):
    c.append(root)
    c.extend(join(root, fi) for fi in files)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35676365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档