0

入力されているように、テキストファイル内のテキストのリストを作成しようとしています..次のようなものです:

T
Te
Tex
Text

うまく説明できないので、以下に例を示します。

テキスト ファイルの内容:

Line 1
Line 2
Line 3

最初の行のリストは次のようになります['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 1', 'Line 1\n']

完全なリストは次のようになります。[['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 1', 'Line 1\n'], ['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 2', 'Line 2\n'], ['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 3']]

これは私の現在のコードです:

lines=open('foo.txt', 'r').readlines()
letters=[]
cnt=0
for line in lines:
    letters.append([])
    for letter in line:
        if len(letters[cnt]) > 0:
            letters[cnt].append(letters[cnt][len(letters[cnt])-1]+letter)
        else:
            letters[cnt].append(letter)
    cnt+=1

print letters

出力は、上記の完全なリストとまったく同じです。

問題は、このコードが大きなファイルではちょっと遅いことです.同じ出力を達成するためのより速い方法はありますか?

4

4 に答える 4

3
result = []
for line in open('foo.txt'):
    result.append([line[:i+1] for i in xrange(len(line))])
print result
于 2013-01-03T18:59:38.380 に答える
2

の使用list comprehension:

In [66]: with open("data.txt") as f:
    print [[line[0:i+1] for i in range(len(line))] for line in f]
   ....:     
[['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 1', 'Line 1\n'], 
 ['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 2', 'Line 2\n'],
 ['L', 'Li', 'Lin', 'Line', 'Line ', 'Line 3', 'Line 3\n']]
于 2013-01-03T18:59:06.570 に答える
1

これは、Python のメモリ ビューの場合に特に適しているように思えます。それらを使用する場合、元の文字列の部分文字列は作成されず、元の文字列のビューだけが作成されます。行数が数文字を超える大きなファイルの場合、パフォーマンスは大幅に向上します。

results = []
with open("data.txt") as f:
    for line in f:
        letters = tuple(buffer(line, 0, i+1) for i in xrange(len(line)))
        results.append(letters)

すべてのプレフィックスのリストをすべて同時に展開する必要がない場合は、ジェネレーターの使用を検討できます。

注: 印刷せずにタイミングを計る場合は、次のことを打ち負かすのは難しいはずです ;-)

with open("data.txt") as f:
    results = (buffer(line, 0, i+1) for line in f for i in xrange(len(line)))
于 2013-01-03T19:21:36.723 に答える