0

文字列の2つの列(x、y座標)間のタブ/空白を削除し、列をコンマで区切り、各列の最大値と最小値をリストするPythonでスクリプトを作成しました(xとy座標ごとに2つの値) . 例えば:

100000.00    60000.00
200000.00    63000.00
300000.00    62000.00
400000.00    61000.00
500000.00    64000.00

なりました:

100000.00,60000.00
200000.00,63000.00
300000.00,62000.00
400000.00,61000.00
500000.00,64000.00

10000000 50000000 60000000 640000000

これは私が使用したコードです:

import string
input = open(r'C:\coordinates.txt', 'r')
output = open(r'C:\coordinates_new.txt', 'wb')
s = input.readline()
while s <> '':
    s = input.readline()
    liste = s.split()
    x = liste[0]
    y = liste[1]
    output.write(str(x) + ',' + str(y))
    output.write('\n')
    s = input.readline()
input.close()
output.close()

上記のコードを変更して、座標を 2 つの 10 進値から 1 つの 10 進値に変換し、2 つの新しい列のそれぞれを x 座標 (左の列) の値に基づいて昇順に並べ替える必要があります。

私は次のように書き始めましたが、値をソートしていないだけでなく、y 座標を左側に、x 座標を右側に配置しています。さらに、値は文字列であり、私が知っている唯一の関数は %f を使用しており、浮動小数点数が必要であるため、小数を変換する方法がわかりません。以下のコードを改善するための提案はありますか?

import string
input = open(r'C:\coordinates.txt', 'r')
output = open(r'C:\coordinates_sorted.txt', 'wb')
s = input.readline()
while s <> '':
    s = input.readline()
    liste = string.split(s)
    x = liste[0]
    y = liste[1]    
    output.write(str(x) + ',' + str(y))    
    output.write('\n')
    sorted(s, key=lambda x: x[o])
    s = input.readline()
input.close()
output.close()

ありがとう!

4

2 に答える 2

0

コードは Python よりも C に似ています。それはかなり一義的です。インスピレーションを得るためにPython チュートリアルを読むことをお勧めします。たとえば、whileループを使用した反復は通常、間違ったアプローチです。stringモジュールはほとんどの場合非推奨です。すでに文字列であるオブジェクトを呼び出す必要はありません<>...!=str()

それから、いくつかのエラーがあります。たとえば、sorted()渡す iterable のソートされたバージョンを返します。それを何かに割り当てる必要があります。そうしないと、結果が破棄されます。とにかく、文字列で呼び出しているため、目的の結果が得られません。x[o]あなたはまた、あなたが明確に意味するところを書きましたx[0]

次のようなものを使用する必要があります (Python 2 を想定):

with open(r'C:\coordinates.txt') as infile:
    values = []
    for line in infile:
        values.append(map(float, line.split()))
values.sort()
with open(r'C:\coordinates_sorted.txt', 'w') as outfile:
    for value in values:
        outfile.write("{:.1f},{:.1f}\n".format(*value))
于 2013-09-22T12:27:58.890 に答える
0

まず、コードをPEP8に従ってフォーマットしてみてください— 読みやすくなります。(私はあなたの投稿ですでにクリーンアップを行っています)。

第二に、C言語から直接翻訳するのではなく、(慣用的な)Pythonとしてコードを書く方法を学ぶべきだという点で、ティムは正しいです。

出発点として、慣用的な Python としてリファクタリングされた 2 番目のスニペットをここに投稿します。

# there is no need to import the `string` module; `.strip()` is a built-in
# method of strings (i.e. objects of type `str`).

# read in the data as a list of pairs of raw (i.e. unparsed) coordinates in
# string form:
with open(r'C:\coordinates.txt') as in_file:
    coords_raw = [line.strip().split() for line in in_file.readlines()]

# convert the raw list into a list of pairs (2-tuples) containing the parsed
# (i.e. float not string) data:
coord_pairs = [(float(x_raw), float(y_raw)) for x_raw, y_raw in coords_raw]

coord_pairs.sort()  # you want to sort the entire data set, not just values on
                    # individual lines as in your original snippet

# build a list of all x and y values we have (this could be done in one line
# using some `zip()` hackery, but I'd like to keep it readable (for you at
# least)):
all_xs = [x for x, y in coord_pairs]
all_ys = [y for x, y in coord_pairs]
# compute min and max:
x_min, x_max = min(all_xs), max(all_xs)
y_min, y_max = min(all_ys), max(all_ys)

# NOTE: the above section performs well for small data sets; for large ones, you
# should combine the 4 lines in a single for loop so as to NOT have to read
# everything to memory and iterate over the data 6 times.

# write everything out
with open(r'C:\coordinates_sorted.txt', 'wb') as out_file:
    # here, we're doing 3 things in one line:
    #   * iterate over all coordinate pairs and convert the pairs to the string
    #     form
    #   * join the string forms with a newline character
    #   * write the result of the join+iterate expression to the file
    out_file.write('\n'.join('%f,%f' % (x, y) for x, y in coord_pairs))

    out_file.write('\n\n')
    out_file.write('%f %f %f %f' % (x_min, x_max, y_min, y_max))

with open(...) as <var_name>と同様に、ファイル ハンドルを確実に閉じることができますtry-finally。また、それは別の行よりも短く、open(...)別の.close()行にあります。また、with他の目的にも使用できますが、一般的にはファイルの処理に使用されます。ここで学んだその他のすべてのことに加えて、Python の /context マネージャーのtry-finally使用方法を調べることをお勧めします。with

于 2013-09-22T13:02:26.013 に答える