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