【问题标题】:Removing string from list and returning max value从列表中删除字符串并返回最大值
【发布时间】:2021-11-14 03:36:26
【问题描述】:
import subprocess
awk1 = subprocess.check_output("awk '{print $1}' "+file+"").decode("utf-8")
print(awk1)

这段代码给出了我正在寻找的结果;我使用AWK 是因为我发现提取 2 - 5 美元比使用 Python 更容易。

当我打印 awk1 时,它给了我;

HEADER
DESCRIPTION (can be over multiple lines)
TEST TYPE 
RESULTS (numbers below are just examples)
-999.00
-500
-100.15
+1
+23.111
+500

我想做的是确定是否有任何结果大于 -500。我尝试使用 max() 但这会抛出错误,因为我有 str 和 ints 存在。同样出于某种原因,如果我尝试将其放入循环中(for i in akw1 ....),它将垂直打印,例如;

1
0
0
.
1
5

Instead of 100.15

结果开头的行可以有不同的长度,结果中的行也可以包含字符串。哪个是删除字符串然后确定数字是否大于指定数量的最有效方法?谢谢。

【问题讨论】:

  • 为什么不尝试初始化一个空白字符串,然后将结果(在每个循环实例的末尾)添加到已经存在的字符串中。

标签: python awk


【解决方案1】:

subprocess.check_output() 将返回bytes(类似于str)。因此迭代它会给你每个单独的字符,例如"H",然后是"E",然后是"A",等等

你可以先用换行符"\n" 分割它。然后迭代列表并尝试转换为int。如果可以转换,请检查是否超出-500。否则,如果无法转换,则忽略它并转到下一个。

from contextlib import suppress

awk1 = b"""HEADER
DESCRIPTION (can be over multiple lines)
TEST TYPE 
RESULTS (numbers below are just examples)
-999.00
-500
-100.15
+1
+23.111
+500"""

for text in awk1.decode().split(b'\n'):
    with suppress(Exception):
        if float(text) > -500:
            print("Found", text)
            break
else:
    print("Not found")

输出

Found b'-100.15'

【讨论】:

  • 太好了,非常感谢您的帮助。我添加了一个快速数组以收集符合条件的任何/所有值,然后从数组中提取最大值。 array1 = [] for text in awk1.decode().split('\n'): with suppress(Exception): if float(text)
  • 很高兴它有帮助 :) 如果这就是您需要的全部答案,您可能希望接受它作为答案stackoverflow.com/help/someone-answers
猜你喜欢
  • 2012-03-27
  • 1970-01-01
  • 2019-05-17
  • 2022-12-15
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多