我想知道如何找到其中最大数字的字符串,并且我希望解决方案简单易懂。
我有一个文件,其中包含以下格式的分数:
bob has 46 points
fred has 0 points
leo has 27 points
max has 34 points
john has 58 points
paolw has 32 points
piper has 20 points
hasan has 72 points
我想要这样,以便将这些分数从大到小打印如下:
hasan has 72 points
john has 58 points
bob has 46 points
max has 34 points
paolw has 32 points
leo has 27 points
piper has 20 points
fred has 0 points
这是我尝试过的:
f = open("file.txt","r") print(sorted(f))
结果是这样的:
['\n', 'bob has 46 points\n', 'fred has 0 points\n', 'hasan has 72 points\n', 'john has 58 points\n', 'leo has 27 points\n', 'max has 34 points\n', 'paolw has 32 points\n', 'piper has 20 points\n']
答案 0 :(得分:1)
Sorted 是您想要的,添加key
以获取您想要的。
用文件数据替换列表。
l = ["bob has 46 points", "fred has 0 points", "leo has 27 points"]
l = sorted(l, key = lambda i: int(i.split()[2]), reverse = True)
输出
['bob has 46 points', 'leo has 27 points', 'fred has 0 points']
答案 1 :(得分:1)
我认为这是初学者友好的解决方案:
scores = {}
with open("file.txt", "r") as f:
for score in f.readlines():
try:
name = score.split(" ")[0]
points = score.split(" ")[2]
scores.update({name: int(points)})
except IndexError:
pass
scores = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)
for name, points in scores:
row = f"{name} has {points} points\n"
print(row)
编辑:如果您的file.txt与我的示例文件不同,请添加例外处理。
答案 2 :(得分:1)
您的第一次尝试已经到了一半,但是您似乎已经挂不住排序了。当您致电sorted(f)
时,实际上发生了一些事情。
sorted
向对象f
请求可迭代的内容,f
返回了一串代表您file.txt
每一行的字符串这里最重要的一点是,每行都是根据文本而不是根据埋在中间某处的数值进行排序的。
如果您想使用内置的sorted
函数进行排序(即:您不想编写自己的排序算法),则需要重新组织数据,以便使用默认的sort方法可以为您提供所需的顺序,或者您需要告诉sorted
函数如何略微更改其默认行为。后者涉及指定传递给key
的{{1}}参数,其他答案已经解决了这个问题。
为了使sorted
可以做我们想做的事情,我们需要给它赋予我们要在每一行中首先排序的值。为此,我们可以从每行中提取数字并将其首先放在列表中,然后在对字符串列表进行排序后再去除它。
sorted
答案 3 :(得分:0)
使用sorted
:
with open('file.txt') as f:
print(
'\n'.join(
sorted(
filter(
lambda line: len(line.split(' ')) >= 2,
f.readlines()
),
key=lambda line: int(line.split(' ')[-2]),
reverse=True
)
)
)