如何从文件中打印包含最大数字的字符串

时间:2019-02-01 20:39:23

标签: python python-3.x file

我想知道如何找到其中最大数字的字符串,并且我希望解决方案简单易懂。

我有一个文件,其中包含以下格式的分数:

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']

4 个答案:

答案 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)时,实际上发生了一些事情。

  1. sorted向对象f请求可迭代的内容,f返回了一串代表您file.txt每一行的字符串
  2. 然后根据字典中每个字符的ascii values对字符串进行排序(按字典排序)。
  3. 将排序后的字符串放入列表中并返回。

这里最重要的一点是,每行都是根据文本而不是根据埋在中间某处的数值进行排序的。

如果您想使用内置的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
            )
        )
    )