我有一个包含以下数字的数据集:
1 30.0 13.4545
2 30.0 10.5578
3 30.0 12.5578
4 5.0 5.224
我有以下代码,根据第二个浮点数打印出具有最小浮点数的行。
with open(fn) as f:
print min(f, key=lambda line: float(line.split()[1]))
我试图找出如何打印具有最大第一个浮点数的行,但是如果浮点数是相同的,那么使用第一个浮点数打印行中具有最小第三个浮点数的行
应打印出来:
2 30.0 10.5578
我想到了这样的事情:
with open(fn) as f:
cpu = max(f, key=lambda line: float(line.split()[1]))
for line in f:
if cpu in line > 1:
print min(f, cpu, key=lambda line: float(line.split()[1]))
但没有运气,我继续打印出最大或最小数字而不看两个条件。
答案 0 :(得分:3)
虽然你可以用lambda做你所要求的事情,但由此产生的lambda也将是一种邪恶的憎恶,也会杀死小猫。严肃地说,这不是一个lambda的好地方,因为除了一些非常糟糕的代码,变量赋值在lambda中是不可能的,变量赋值会使这个问题变得更容易。
现在,问题本身。您的问题基本上是如何按第二个值按降序对项目进行排序,然后按第三个值按升序排序。
具有最大第二元素和最小第三元素的项目也可以描述为具有最大第二元素和最小负第三元素的项目。
要在Python中执行此操作,我们可以创建一个用作键的函数。这个函数占用每一行,切掉行的第一个元素(因为它不相关),并使第三个值为负。
您可以使用列表推导来完成:
def myKey(line):
key = [float(i) for i in line.split()[1:]]
key[1] *= -1
return key
print max(x, key=myKey)
或map()
def myKey(line):
key = map(float, line.split()[1:])
key[1] *= -1
return key
print max(x, key=myKey)
而且,果然,输出是:
2 30.0 10.5578
答案 1 :(得分:2)
def key(line):
x,y = line.split()[1:]
return (float(x),-float(y))
with open(fn) as f:
max((l for l in f if l.strip()),key=key)
或者使用lambda,
with open(fn) as f:
max((l for l in f if l.strip()),key=lambda x: (float(x.split()[1]),-float(x.split()[2])))
答案 2 :(得分:1)
如果您的唯一目标是读取文件一次并获得该行,那么这实际上并不像它那样糟糕。
max_col2 = -float('inf')
min_col3 = float('inf')
targetline = None
for line in f:
idx, col2, col3 = line.split()
if col2 > max_col2:
targetline = line.strip()
max_col2 = col2
if col2 == max_col2 and col3 < min_col3:
targetline = line.strip()
min_col3 = col3
targetline
将是您要求的行。