我有一个文件中的足球统计数据。我可以将玩家的名字和每个属性分成两个或更多个空格。我试图让码头领导者,所以我需要排序第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
我收到两个错误:
$./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
我的文件不是列表列表,但如果我拆分每一行并尝试按第三个索引排序,我仍然会在文件的第一个名称中找到第四个字符。
答案 0 :(得分:1)
您的问题在这里:
for line in lines:
line = re.split("\s\s+", line)
您不能像这样修改列表的值 - 您只是为变量分配一个新值,然后在下次循环运行时替换该值。这什么都不做。
相反,使用list comprehension构建新列表:
lines = [re.split("\s\s+", line) for line in lines]
答案 1 :(得分: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])
希望这能帮到你!
答案 2 :(得分:0)
您的代码存在的问题是,您正在迭代lines
,但在循环内为line
分配新值不会修改原始列表的内容。它仍然是一个字符串列表,因此lines[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
答案 3 :(得分:0)
除了其他人提到的问题,你还有一个基本的解析问题:考虑那些流氓 Cmfc bumble bee 和刺客NinjaX 。如果我们在空白上拆分数据行,我们最终会在数据中包含太多字段,因为名称包含空格。例如,元素[3]
在从一个数据记录到另一个数据记录时不具有一致的含义。
这是处理问题的另一种方法:
# 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)