-3

ファイルにサッカーの統計があります。プレイヤーの名前と各ステータスを 2 つ以上のスペースで区切ることができます。ヤード リーダーを取得しようとしているので、4 番目の列または 3 番目のインデックスで並べ替える必要があります。

これが私のコードです:

import re, sys
try:
   file = open("TTL.txt", "r")
except IOError:
   print "Could Not Open TTL"
sys.exit()
lines = file.readlines()
for line in lines:
   line = re.split("\s\s+", line)
def key_fct(lines):
   return (float(lines[3]))
srtlines = sorted(lines, key = key_fct, reverse = True)
for line in srtlines:
   print line
file.close()

サンプル入力:

abel161 8 77 443.0 5 0 11.7 147.2
Abyss ll 38 145 1158.0 11 6 12.8 55.9
AFFISHAUL 34 33 366.0 2 4 17.8 22.7
Assassin NinjaX 25 35 184.0 0 7 10.3 15.1
aubby57 23 165 839.0 11 0 10.5 75.3
B1U3 S4V10R 26 116 380.0 4 6 6.0 29.2
Bigkle 24 47 149.0 2 4 6.7 32.8
BLKSUP3RSA1YAN 5 52 65.0 3 1 9.9 22.7
Booksack 33 85 477.0 5 5 11.0 29.2
Brandon6154xx 23 106 809.0 8 0 17.6 97.0
budweizerbeast 35 472 1640.0 27 9 6.8 94.5
BulkKiller1 31 455 3012.0 40 5 12.6 182.6
Carnage311 30 369 2349.0 25 6 12.8 158.3
cinemagiic 32 12 -8.0 0 2 -1.3 -0.6
Cmfc bumble bee 20 41 253.0 1 0 12.3 28.9
CMFCplaya 19 78 366.0 4 4 9.5 48.9

2 つのエラーが表示されます。

$./sort.py 
Traceback (most recent call last):
  File "./sort.py", line 39, in <module>
    srtlines = sorted(lines, key = key_fct, reverse=True)
  File "./sort.py", line 37, in key_fct
    return (float(lines[3]))  
ValueError: invalid literal for float(): l

私のファイルはリストのリストではありませんが、各行を分割して 3 番目のインデックスで並べ替えようとすると、ファイルの最初の名前に 4 番目の文字が表示されます。

4

4 に答える 4

1

あなたの問題はここにあります:

for line in lines:
   line = re.split("\s\s+", line)

このようにリストの値を変更することはできません。変数に新しい値を代入するだけで、次にループが実行されるときにその値が置き換えられます。これはまったく何もしません。

代わりに、リスト内包表記を使用して新しいリストを作成します。

lines = [re.split("\s\s+", line) for line in lines]
于 2013-07-06T16:46:50.983 に答える
0

他の人が指摘した問題に加えて、基本的な解析の問題もあります。これらの不正な Cmfc bumble beeAssassin NinjaXを検討してください。データ行を空白で分割すると、名前に空白が含まれているため、データ内のフィールドが多すぎることになります。[3]たとえば、Elementは、データ レコード間で一貫した意味を持ちません。

問題を処理する別の方法を次に示します。

# Read the data, naively splitting on whitespace.
with open(sys.argv[1]) as fh:
    football_data = [line.split() for line in fh]

# Reorganize the data.
for i, fd in enumerate(football_data):
    # stats: the last 7 elements.
    # name:  anything to the left of the stats.
    stats = [float(n) for n in fd[-7:]]
    name  = ' '.join(fd[0:-7])
    football_data[i] = [name] + stats

# Sort as needed.
football_data.sort(key = lambda fd: fd[3], reverse = True)
于 2013-07-06T17:17:46.117 に答える
0

ここでの問題は、次のコードです。

for line in lines:
    line = re.split("\s\s+", line)

ご想像のとおり、これは行をリストに再割り当てしていません。実際には行をまったく変更していません。私がお勧めするのは、次のような新しいリストを作成することです。

splitLines = []
for line in lines:
    splitLines.append(re.split("\s\s+", line))

または、代わりにインデックスを使用します。

for i in range(len(lines)):
    lines[i] = re.split("\s\s+", lines[i])

これがお役に立てば幸いです!

于 2013-07-06T16:46:35.363 に答える
0

コードの問題は、反復処理を行っているlinesが、ループ内に新しい値を割り当ててlineも元のリストの内容が変更されないことです。これはまだ文字列のリストであるため、lines[3]実際には、期待した 3 番目の項目ではなく、各行の 3 番目の文字が返されます。

lines = file.readlines()
for line in lines:
   line = re.split("\s\s+", line)  #This thing won't affect original list

できるよ:

lines = file.readlines()
for i,line in enumerate(lines):
   lines[i] = re.split("\s\s+", line)

またはより良い:

import re
with open('abc') as f:
    lines = [re.split("\s\s+", line) for line in f]
    lines.sort(key = lambda x: float(x[3]), reverse = True)    
    print lis
于 2013-07-06T16:46:55.060 に答える