3

テーブルの最初の列を並べ替える必要があります。それは次のように見えます

6000 799 
7000 352
8000 345
9000 234
10000 45536 
11000 3436
1000 342
2000 123
3000 1235
4000 234
5000 233

最初の列を昇順にしたいのですが、列全体の値ではなく、最初の桁のみで並べ替えています。

1000 342
10000 45536
11000 3436
2000 123

でも私はしたい

1000 342
2000 123
3000 1235
etc

現在試行中:

SortInputfile=open("InterpBerg1","r")
line=SortInputfile.readlines()
line.sort()
map(SortOutputfile.write, line)
4

4 に答える 4

5

sortand関数はsorted、並べ替えの実行に使用するキーを指定できるようにするキー引数をサポートしています。数値の並べ替え順序が必要で、アルファベット順の並べ替え順序が必要ないため、最初の列を抽出して int に変換する必要があります。

SortInputfile=open("InterpBerg1","r")
line=SortInputfile.readlines()
line.sort(key=lambda line: int(line.split()[0]))
map(SortOutputfile.write, line)

これのよりクリーンなバージョンは次のようになります。

# read input file
with open(input_filename) as fh:
    lines = fh.readlines()

# sort lines
lines.sort(key=lambda line: int(line.split()[0]))

# write output file
with open(output_filename, 'w') as fh:
    fh.writelines(lines)
于 2013-01-29T20:19:40.500 に答える
2

数値順の場合は、文字列を数値に変換する必要があります。オンザフライで実行するには、次のkeyパラメーターを使用します。

outfile.writelines(sorted(
    open('InterpBerg1'),
    key = lambda l: int(l.split(maxsplit=1)[0])))

with編集:ファイルを操作するときにステートメントを使用することを提案する他の人に同意します。

with open('Output', 'w') as outfile, open('InterpBerg1') as infile:
    outfile.writelines(sorted(infile,
        key = lambda l: int(l.split(maxsplit=1)[0])))
于 2013-01-29T20:19:24.340 に答える
1

まず、Python でリストをソートする標準的な方法が 2 つあることを知っておく必要があります。1 つ目は、リストを受け取り、リストのソートされたコピーsorted()を返す汎用組み込み関数であるです。2 つ目は、このリストをそのでソートする(そして を返す)リストの組み込みメソッドです。 . あなたが使用している; ありません。.sort()None.sort().sorted()

次に、リスト内の項目が整数ではありません。それらは文字列です。readlines()これは、文字列の配列を返すを使用してリストを作成したという事実からわかります。文字列をソートすると、デフォルトでアルファベット順にソートされます。これが、例で「最初の桁のみ」でソートされているように見える理由です。

他のもので並べ替えるには、2 つのオプションがあり、どちらもsorted()関数と.sort()メソッドのキーワード パラメータとして表現されます。1つ目は、他のいくつかの回答ですでに述べたようにkey、大まかに言えば、並べ替えに使用するリスト項目の品質または属性を定義するパラメーターです。あなたの場合、最初の数値の値を使用したいと考えています。これは、文字列を空白で分割し、最初のトークンを取り、int に変換することで取得できます。(Lev Levitsky と bikeshedder の回答はどちらも、これを行う適切な方法を示しています)。に渡される値はkey、リスト項目を入力として取り、目的の値を返す関数 (標準関数またはラムダ関数のいずれか) でなければなりません。使用できる他のパラメーターは、cmpこれは、入力として 2 つのリスト項目 (またはパラメーターも定義する場合はそれらのキー) を取り、keyどちらの項目が「大きい」かを示す値を返す関数です。これは使用するのが少し複雑な機能ですが、並べ替えの柔軟性がいくらか増します。

于 2013-01-29T20:26:06.967 に答える
0

他の回答と同じ-ほんの数分遅れ、IMOはもう少し読みやすくなっています。

lines = []

with open("InterpBerg1","r") as f:
    for line in f:
        lines.append(tuple(int(i) for i in line.split()[:]))

print sorted(lines)
于 2013-01-29T20:22:54.863 に答える