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)
使用您的数据文件,我们可以迭代文件内的每一行,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)
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |