Python,根据一行中的多个条件查找特定行
Python, finding a specific line based on multiple coniditions in a line
我有一个包含以下数字的数据集:
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]))
但运气不好,我一直打印出最大值或最小值,而没有查看这两个条件。
虽然可以用 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
如果您的唯一目标是读取文件一次并获取该行,那么这实际上并没有想象的那么糟糕。
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
将是您请求的行。
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])))
我有一个包含以下数字的数据集:
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]))
但运气不好,我一直打印出最大值或最小值,而没有查看这两个条件。
虽然可以用 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
如果您的唯一目标是读取文件一次并获取该行,那么这实际上并没有想象的那么糟糕。
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
将是您请求的行。
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])))