我的代码存在问题,我正试图找到一种方法来显示从最高到最低的分数。
但每次我这样做时都会出现一堆数字或它说对象。
我正在尝试从存储它的文本文件中获取分数。除了这部分,我的其余代码都很好。
我尝试了很多方法,以至于我没有意识到我在做什么。
with open('class1.txt', 'r') as f:
for f in sorted(f):
name, *scores = f.split(',')
hl = list(reversed(scores))
print (hl)
我的文本文件如下所示:
nathan ,2, 0, 10
adil ,8, 9, 7
masuda ,7, 4, 6
zain ,0, 0, 3
abdur rauf ,2, 0, 0
danniel ,7, 7, 2
这是我运行代码时得到的结果:
> [' 0\n', ' 0', '2']
[' 7\n', ' 9', '8']
[' 2\n', ' 7', '7']
[' 6\n', ' 4', '7']
[' 10\n', ' 0', '2']
[' 3\n', ' 0', '0']
真的应该是这样的
adil ,9, 8, 7
abdur rauf ,2, 0, 0
danniel ,7, 7, 2
masuda ,7, 6, 4
nathan ,10, 2, 0
zain ,3, 0, 0
答案 0 :(得分:2)
sorted(f)
为您提供类似的内容:
['abdur rauf ,2, 0, 0 \n',
'adil ,8, 9, 7 \n',
'danniel ,7, 7, 2\n',
'masuda ,7, 4, 6 \n',
'nathan ,2, 0, 10 \n',
'zain ,0, 0, 3 \n']
请注意,有一些\n
,这意味着新行。
解决方案:
简单地使用str.splitlines()
之类的:
for f in sorted(f.read().splitlines())
f.split(',')
为您提供(修复\n
问题后):
['abdur rauf ,2, 0, 0 ',
'adil ,8, 9, 7 ',
'danniel ,7, 7, 2',
'masuda ,7, 4, 6',
'nathan ,2, 0, 10 ',
'zain ,0, 0, 3 ']
这不起作用,因为,
后面有一些空格。此外还有另一个空间。
<强>解决方案:强>
使用re.split('\s*,\s*', f)
,删除该行末尾的另一个空格,您可以像这样使用str.strip()
:
>>> for f in sorted(f.read().splitlines()):
... re.split('\s*,\s*', f.strip())
...
...
['abdur rauf', '2', '0', '0']
['adil', '8', '9', '7']
['danniel', '7', '7', '2']
['masuda', '7', '4', '6']
['nathan', '2', '0', '10']
['zain', '0', '0', '3']
list(reversed(scores))
只能撤销scores
列表。你应该再次使用sorted()
。
但是因为在str对象上使用sorted
(如'2'
,'3'
)会给你不正确的输出。例如,'10' < '2'
为True
。将它们转换为int对象使用map(int, scores)
。
您还需要从最高到最低。然后,您可以通过以下方式启用reverse
的{{1}}选项:
sorted
Here's another question on SO关于hl = sorted(map(int, scores), reverse=True)
和reversed
sorted(list, reverse=True)
只能打印出该列表。在这种情况下,我认为你需要加入他们' ,'.join([name]+scores)
:
print(hl)
所以完整的代码如下:
print(' ,'.join([name]+list(map(str, hl)))) # covert `hl` elements to str objects again since we need use `str.join`
输出结果为:
import re
with open('class1.txt', 'r') as f:
for f in sorted(f.read().splitlines()):
name, *scores = re.split('\s*,\s*', f.strip())
hl = sorted(map(int, scores), reverse=True)
print(' ,'.join([name]+list(map(str, hl))))