Python 有人能告诉我如何不使用循环来实现这一点吗?

Python 有人能告诉我如何不使用循环来实现这一点吗?,python,functional-programming,Python,Functional Programming,如果不可能创建没有循环的列表,我会满足于尽可能减少创建列表所需的时间。目标是创建一个二维数组,其中包含10个左右文件夹中每个文件夹中100个pdf文件的文件名。告诉我你的想法: foldernames = [ 'Named_folder00/', 'Named_folder01/', 'Named_folder02/', 'Named_folder03/', 'Named_folder04/',

如果不可能创建没有循环的列表,我会满足于尽可能减少创建列表所需的时间。目标是创建一个二维数组,其中包含10个左右文件夹中每个文件夹中100个pdf文件的文件名。告诉我你的想法:

    foldernames = [ 
        'Named_folder00/',
        'Named_folder01/',
        'Named_folder02/',
        'Named_folder03/',
        'Named_folder04/',
        'Named_folder05/',
        'Named_folder06/',
        'Named_folder07/',
        'Named_folder08/',
        'Named_folder09/',
        ]

    pages = []
    for b in xrange(len(foldernames)):
        pg_temp = [
            foldernames[b] + 'title1',
            foldernames[b] + 'title2',
            foldernames[b] + 'title3'
            ]
        pg_temp += [ foldernames[b] + '0' + str(j) for j in xrange(1,10) ]
        pg_temp += [ foldernames[b] + str(k) for k in xrange(10,100) ]
        for c in xrange(len(pg_temp)):
            pg_temp[c] += '.pdf'
        pages.append(pg_temp)
注意:我不知道它有多快,没有对它进行基准测试


注:我不知道它有多快,没有标明它。

< P>如果目标是功能性的,考虑用MAP()替换等同于列表的理解。将代码转换为:

pages = map(lambda foldername:
                map((foldername + 'title%d').__mod__, xrange(1,4)) +
                map((foldername + '%02d.pdf').__mod__, xrange(1,100)),
            foldernames)
可以说,新代码可读性更强,速度更快,功能更强

或者,可以预先计算标题和PDF,然后使用、和str.\uuuuuu add\uuuuu与文件夹名组合。这应该是最快的版本:

from itertools import product, starmap

titles = map('title%d'.__mod__, xrange(1, 4))
pdfs = map('%02d.pdf'.__mod__, xrange(1, 100))
pages = list(starmap(str.__add__, product(foldernames, (titles + pdfs))))

如果目标是功能性的,考虑使用MAP()替换等价于列表的理解。将代码转换为:

pages = map(lambda foldername:
                map((foldername + 'title%d').__mod__, xrange(1,4)) +
                map((foldername + '%02d.pdf').__mod__, xrange(1,100)),
            foldernames)
可以说,新代码可读性更强,速度更快,功能更强

或者,可以预先计算标题和PDF,然后使用、和str.\uuuuuu add\uuuuu与文件夹名组合。这应该是最快的版本:

from itertools import product, starmap

titles = map('title%d'.__mod__, xrange(1, 4))
pdfs = map('%02d.pdf'.__mod__, xrange(1, 100))
pages = list(starmap(str.__add__, product(foldernames, (titles + pdfs))))

这可以通过以下方式轻松完成:


这可以通过以下方式轻松完成:



这行中的
a
是什么:
对于xrange中的c(len(a)):
?从上下文来看,我假设它实际上应该是
pg_temp
。我猜它是
pg_temp
。您可以将的
替换为
映射
。你不需要两个
range
s你可以合并它们。Oops--是的,'a'应该是'pg\u temp'--现在修复的是
xrange(11100)
打算是
xrange(10100)
?这行中
a
是什么:
对于xrange(len(a))中的c:
?我假设它应该是
pg temp
,根据上下文。我猜是
pg\u temp
。您可以将
替换为
映射
。你不需要两个
range
s你可以合并它们。Oops--是的,a应该是'pg\u temp'--现在已经修复了
xrange(11100)
打算成为
xrange(10100)
lambda x:“。join(x)
可以被
''替换。join
@DSM:是的,我自己在缩短代码的时候看到过它,感谢您的注意:)这个解决方案速度非常快,编写得非常好。很好的工作:-)使用
product
不会创建嵌套的列表结构。
lambda x:“”。join(x)
可以替换为
“”。join
@DSM:是的,我自己在一般情况下缩短代码时看到了它,感谢您的注意:)这个解决方案编写得非常快速和漂亮。很好的工作:-)使用
product
不会创建嵌套的列表结构。您可以使用file作为变量名,因为它在python中是一个保留字吗?@futuristcorporation是的,但您不应该。这不是一个保留字。事实上,我认为使用文件是可以的。使用(例如)str作为字符串名称的常见反对意见是,您以后会想使用str函数,而从内置函数获取它是一件麻烦事。但是在文件的情况下,您总是可以选择打开(在3.2中,首先没有文件)。@Ben:范围仅限于python3。@KarolyHorvath我怎么不知道?在这种情况下,更糟糕的是命名列表理解变量,使其成为内置变量的阴影(你能用file作为变量名吗?因为它在python中是一个保留字?@futuristcorporation是的,但你不应该。它不是一个保留字。实际上,我认为使用file是可以的。通常反对使用(例如)str作为字符串的名称,意味着您以后会想使用str函数,从内置程序获取它是一件麻烦事。但是在文件的情况下,您总是可以选择open(在3.2中,首先没有文件)@Ben:范围仅限于python3。@KarolyHorvath我怎么会不知道?在这种情况下,命名列表理解变量以使其隐藏内置变量更糟糕。:(使用
product
不会创建嵌套列表结构。使用
product
不会创建嵌套列表结构。
from itertools import product
foldernames = ['Named_folder%02d/' % i for i in xrange(10)]
pagenames = ['title%d.pdf' % i for i in xrange(1,4)] + ['%02d.pdf' % i for i in xrange(1,100)]
pages = map("".join, product(foldernames,pagenames))