7

私は常にこのコマンドラインを使用して、一意の行のみを並べ替えて取得します。これは、大きなファイル(500,000行以上)でも魅力的に機能します

sort filename.txt | uniq | sponge filename.txt

最短の同等の python コードは次のようになります

f = open("filename.txt", "r")
lines = [line for line in f]
lines = lines.sort()
lines = set(lines)

もちろん、これはメモリの制約のためにスケーラブルではなく、Pythonでスケーラブルなコードを書くには時間がかかるので、Pythonで最も短い同等のコード(パッケージ)は何ですか

4

4 に答える 4

3

sorted と同じことを行う iterator があります。前の行と等しくない行のみを生成することにより、uniq を模倣するものを作成しましょう。

def uniq(iterator):
    previous = float("NaN")  # Not equal to anything
    for value in iterator:
        if previous != value:
            yield value
            previous = value

これで、次を使用して同じことができます。

with open('/path/to/filename') as f:
    for line in uniq(sorted(f)):
        print(line)

しかし、ソート済み (およびシェルのソート) はとにかくすべてを格納する必要があるため (ファイルの最後の行を最初に出力する必要がある場合)、uniq(sorted(f)) の代わりに set(f) を使用するよりも悪いことです。

于 2013-11-04T09:56:46.247 に答える
2

Python からシェル コマンドを使用します。

import os
os.system("sort filename.txt | uniq | sponge filename.txt")
于 2014-03-25T07:15:25.620 に答える
1

以下に短い例を示します。

with open("filename.txt", 'r') as f:
    lines = set(f)

また、この場合、一度に 1 行だけがメモリにロードされることに注意してください。この理由は、上記のコードが以下と同等であるためです。

lines = set()
f = open("filename.txt", 'r')
for line in f: # now f works as a generator of lines, reading only one line at a time
     lines.add(line)
于 2013-11-04T09:33:12.050 に答える