2012-03-25 21 views
1

ループなしでこのリストを作成できない場合は、このリストを作成するのにかかる時間を最小限に抑えることに満足しています。目標は、10個程度のフォルダのそれぞれに100個のpdfファイルのファイル名を持つ2次元配列を作成することです。あなたの考えを教えてください:誰も私にループを使わないでこれを行う方法を教えてもらえますか?

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

この行の 'A'は何:' cに対するxrangeの中(LEN(Aこれが最速のバージョンでなければなりません)): '? – huon

+0

私はそれがコンテキストから 'pg_temp'であるべきだと仮定しています。 –

+0

私はそれが 'pg_temp'だと思います。 'for'を' map'に置き換えることができます。あなたはそれらをマージすることができる2つの 'range'sを必要としません。 –

答えて

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] 

注:私は、それがどのように速く見当がつかないベンチマークそれをしませんでした。

+0

pythonの予約語であるため、ファイルを変数名として使用できますか? – mttpgn

+0

@futuristcorporationはい、そうしてはいけません。予約語ではありません。 – Marcin

+0

実際、ファイルを使うのは大丈夫だと思います。文字列の名前としてstrを使用することに対する通常の反対は、str-the-functionを後で使用し、組み込み関数から取得することが迷惑であるということです。しかし、ファイルの場合、あなたは常に選択肢としてオープンしています(そして3.2では最初にファイルがありません)。 – DSM

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を用いfoldernamesと合わせ、そしてSTR .__ add__。これは非常に簡単にitertools.productを使用して行うことができ

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

)これは多くの助けとなりました – mttpgn

+0

'product'を使うとそのネストされたリスト構造は作成されません –

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)] 
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)) 
+0

' lambda x: "" .join(x) 'は' ''.join'で置き換えられます – DSM

+0

@ DSM:はい、気づいてくれてありがとう、私のコードを一般的に短縮したとき、私はそれを自分で見ました:) – KillianDS

+0

この解決方法はすごく素早く書かれています。ニースの仕事:-) –

関連する問題