Python,sorted():按第3列对足球统计数据进行排序

2024-06-09 08:58:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个档案里的足球数据。我可以把玩家的名字和每个属性分开两个或更多的空格。我正在尝试获取码的领导者,所以我需要按第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()

样本输入:

^{pr2}$

我有两个错误:

$./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

我的文件不是一个列表列表,但是如果我拆分每一行并尝试按第三个索引排序,我仍然会在文件的名字中得到第四个字符。在


Tags: keyinpyrefor排序sysline
3条回答

这里的问题是以下代码:

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

这并不像您所期望的那样将行重新分配到列表中。你根本就没有改变路线。我建议创建一个新的列表,如下所示:

^{pr2}$

或者使用索引:

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

希望这对你有帮助!在

你的问题是:

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

你不能像这样修改列表的值-你只是给变量分配一个新值,然后在下次循环运行时替换它。这根本没用。在

相反,请使用list comprehension来构造一个新列表:

^{pr2}$

代码的问题是,您正在迭代lines,但是在循环中为line分配一个新值并不会修改原始列表的内容。它仍然是一个字符串列表,因此lines[3]实际上从每一行返回第三个字符,而不是您期望的第三个项目。在

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

您可以:

^{pr2}$

或更好:

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

相关问题 更多 >