谁能告诉我如何在不使用循环的情况下执行此操作?

时间:2012-03-25 00:40:17

标签: python functional-programming

如果无法在没有循环的情况下创建此列表,我将满足于最小化创建此列表所需的时间。目标是在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)

4 个答案:

答案 0 :(得分:3)

如果要实现目标,请考虑使用 map()将列表推导替换为等效项。这会将您的代码转换为:

pages = map(lambda foldername:
                map((foldername + 'title%d').__mod__, xrange(1,4)) +
                map((foldername + '%02d.pdf').__mod__, xrange(1,100)),
            foldernames)

可以说,新代码更具可读性,速度更快,功能更强。

或者,可以预先计算标题和pdf,然后使用itertools.productitertools.starmap和str .__ add__与 foldernames 结合使用。这应该是最快的版本:

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))))

答案 1 :(得分:2)

files = ['title1.pdf', 'title2.pdf', 'title3.pdf']
files += [ "%.2d.pdf" % j for j in range(1,100)]
pages = [[folder+file for file in files] for folder in foldernames]

注意:我不知道它有多快,没有基准测试。

答案 2 :(得分:2)

使用itertools.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))

答案 3 :(得分:1)

x = ["title%d" % i for i in xrange(1,4)] + ["%02d" % i for i in xrange(1,100)]  
pages = [["Named_folder%02d/%s.pdf" % (i,j) for j in x] for i in xrange(10)]