1

私はPythonに少し慣れていません。文字列と整数のリストを並べ替えようとしています。リストには、フィルターで除外する必要のある記号がいくつか含まれています (つまり、ro!ad は道路で終了する必要があります)。また、それらはすべてスペースで区切られた 1 行にあります。したがって、2 つの引数を使用する必要があります。1 つは入力ファイル用、次に出力ファイル用です。最初に数字でソートし、次に特殊文字を含まない単語をそれぞれ別の行にソートする必要があります。私はたくさんのリスト関数を見てきましたが、このようなことをする必要がなかったので、これをまとめるのに苦労しています. テイカーはいますか?

これまでのところ、私は基本的なものを持っています

#!/usr/bin/python

import sys

try:
  infilename = sys.argv[1] #outfilename = sys.argv[2]
except:
  print "Usage: ",sys.argv[0], "infile outfile"; sys.exit(1)

ifile = open(infilename, 'r')
#ofile = open(outfilename, 'w')
data = ifile.readlines()
r = sorted(data, key=lambda item: (int(item.partition(' ')[0])
                               if item[0].isdigit() else float('inf'), item))
ifile.close()
print '\n'.join(r)
#ofile.writelines(r)
#ofile.close()

出力はファイルの内容を正確に示していますが、ファイルが書き込まれたとおりであり、まったくソートされていません。目標は、ファイル (arg1.txt) を取得して並べ替え、コマンド ライン変数となる新しいファイル (arg2.txt) を作成することです。この場合、編集を高速化するために印刷を使用しましたが、ファイルに書き込む必要があります。そのため、出力ファイルの領域にコメントが付けられていますが、それを台無しにしてしまった場合は、遠慮なく言ってください。助けてくれてありがとう!

4

3 に答える 3

1

それらは同じ行にあるので、実際には readlines は必要ありません

with open('some.txt') as f:
    data = f.read()  #now data = "item 1 item2 etc..."

re を使用して、不要な文字を除外できます

import re
data = "ro!ad"
fixed_data = re.sub("[!?@$]","",data)

パーティションはやり過ぎかもしれません

data = "hello 23frank sam wilbur"
my_list = data.split() # ["hello","23frank","sam","wilbur"]
print sorted(my_list)

ただし、数字を強制的に並べ替えるには、おそらく次のようなことを行う必要があります

numbers = [x for x in my_list if x[0].isdigit()]
strings = [x for x in my_list if not x[0].isdigit()]
sorted_list = sorted(numbers,key=lambda x:int(re.sub("[^0-9]","",x))) + sorted(strings(
于 2012-09-16T05:52:55.007 に答える
1

このような問題が発生した場合は、通常、プログラム全体のさまざまな時点でデータをチェックして、希望どおりに表示されていることを確認することをお勧めします。ここでの問題は、ファイルを読み込んでいる方法にあるようです。

data = ifile.readlines()

ファイル全体を行のリストとして読み込みます。ただし、並べ替えたいエントリはすべて 1 行にあるため、このリストにはエントリが 1 つしかありません。リストをソートしようとすると、長さ 1 のリストが渡されます。これは、キー関数が何であるかに関係なく、同じリストを返すだけです。行を次のように変更してみてください

data = ifile.readlines()[0].split()

デフォルトでは数字が文字の前に配置されるため、キー機能はもう必要ないかもしれません。ただし、特殊文字を削除するためのコードは何も表示されません。

于 2012-09-16T05:53:32.517 に答える
0

また、それらはすべてスペースで区切られた 1 行にあります。

あなたのファイルには1行しか含まれていませんか?

データ = ifile.readlines()

これによりdata、ファイル内の行のリストが作成されます。それらのすべて 1。

r = ソート済み(...)

これによりr、そのリストのソートされたバージョンが作成されます。

行から単語を取得するには.read()、ファイル全体を単一の文字列として取得でき.split()ます (デフォルトでは、空白で分割されます)。

于 2012-09-16T05:54:45.417 に答える