【问题标题】:How to return a tuple containing the smallest and largest numbers in the file如何返回包含文件中最小和最大数字的元组
【发布时间】:2022-11-03 22:43:30
【问题描述】:

在这个练习中,我需要编写一个函数来输入一个代表文件名的字符串。文件 包含一个整数列表,每行一个整数。函数应该返回一个包含文件中最小和最大数字的元组。

我下面的代码尝试确实通过了自动评分器,但它很难看。想问问有没有更有效的方法来解决这个问题。

def find_range(filename):
    tu = ()
    with open(filename, 'r') as file:
        m = max(file.readlines(), key=lambda x: int(x))
    with open(filename, 'r') as file:
        s = min(file.readlines(), key=lambda y: int(y))
        tu = int(s), int(m)
    return tu

【问题讨论】:

    标签: python tuples max min


    【解决方案1】:

    您可以使用 itertools.tee 不打开并遍历文件两次:

    from itertools import tee
    
    
    def find_range(filename):
        with open(filename, "r") as f_in:
            i1, i2 = tee(map(int, f_in))
            return min(i1), max(i2)
    

    仅在文件上迭代一次的解决方案:

    def find_range(filename):
        mn, mx = float("inf"), float("-inf")
        with open(filename, "r") as f_in:
            for i in map(int, f_in):
                if i < mn:
                    mn = i
                if i > mx:
                    mx = i
        return mn, mx
    

    【讨论】:

    • tee 在这里真的有意义吗?如果“三通做什么”是准确的,这会将整个文件缓冲在内存中,所以你也可以只收集列表中的行,对吗?
    • @tobias_k 是的,如果我正确理解文档,第一次调用 min() 将缓冲文件。可以只对文件进行一次迭代,但解决方案会更大。编辑:我添加了只迭代一次的解决方案。
    • 我不认为你的第一行是正确的。实际上,您只在迭代文件时打开一次(就 HDD 访问而言),但您将整个文件保存在内存中(您可以更简单地使用简单的list(f_in),但无论如何)。
    猜你喜欢
    • 2018-01-09
    • 2022-11-16
    • 2020-01-08
    • 2011-10-31
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2018-06-11
    • 2018-09-17
    相关资源
    最近更新 更多