找到文件中最小的浮点数并打印该行

oct*_*ain 3 python floating-point min

我有一个这样的数据文件:

1 13.4545
2 10.5578
3 12.5578
4 5.224
Run Code Online (Sandbox Code Playgroud)

我试图找到具有最小浮点数的行并将整行(包括整数)打印或写入另一个文件。所以我得到这个:

4 5.224
Run Code Online (Sandbox Code Playgroud)

我有这个但不起作用:

with open(file) as f:
    small = map(float, line)
    mini = min(small)
    print mini
Run Code Online (Sandbox Code Playgroud)

也尝试使用这个:

with open(file) as f:
    mylist = [[line.strip(),next(f).strip()] for line in f]
    minimum = min(mylist, key = lambda x: float(x[1]))
    print minimum
Run Code Online (Sandbox Code Playgroud)

daw*_*awg 5

使用您的数据文件,我们可以迭代文件内的每一行,min因为min需要一个迭代器:

>>> with open(fn) as f:
...    print min(f)
... 
1 13.4545
Run Code Online (Sandbox Code Playgroud)

显然,这是使用整数的ascii值来确定min。

Python 的min需要一个关键函数:

def kf(s):
    return float(s.split()[1])

with open(fn) as f:
    print min(f, key=kf)
Run Code Online (Sandbox Code Playgroud)

或者:

>>> with open(fn) as f:
...    print min(f, key=lambda line: float(line.split()[1]))
... 
4 5.224
Run Code Online (Sandbox Code Playgroud)

优点(在两个版本中)是文件是逐行处理的——不需要将整个文件读入内存。

打印整行,但仅使用浮点部分来确定该行的最小值。


要修复您的版本,问题是您的第一个列表理解。您的版本next()中包含您可能认为是下一个数字的内容。它不是:它是下一行:

>>> with open(fn) as f:
...      mylist = [[line.strip(),next(f).strip()] for line in f]
... 
>>> mylist
[['1 13.4545', '2 10.5578'], ['3 12.5578', '4 5.224']]
Run Code Online (Sandbox Code Playgroud)

第一个列表理解应该是:

>>> with open(fn) as f:
...    mylist=[line.split() for line in f]
... 
>>> mylist
[['1', '13.4545'], ['2', '10.5578'], ['3', '12.5578'], ['4', '5.224']]
Run Code Online (Sandbox Code Playgroud)

然后剩下的就可以正常工作了(但是在这种情况下你将有分割列表——而不是行——要打印):

>>> minimum=min(mylist, key = lambda x: float(x[1]))
>>> minimum
['4', '5.224']
Run Code Online (Sandbox Code Playgroud)