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