编写此Python代码的更简洁方法

时间:2018-06-05 15:24:04

标签: python

在Python中,我想测试Linux命令输出中是否存在关键字。要测试的关键字将作为列表传递,如下所示。我没有花太多时间使用Python,所以蛮力方法如下。是否有更清晰的方式来写这个?

def test_result (result, mykeys):

  hit = 0
  for keyword in mykeys:
     if keyword in result:
        hit = 1
        print "found a match for " + keyword

  if hit == 1:
     return True


result = "grep says awk"
mykeys = ['sed', 'foo', 'awk']
result = test_result (result, mykeys)

4 个答案:

答案 0 :(得分:4)

内置的any会执行此操作。

def test_result(result, mykeys):
    return any(key in result for key in mykeys)

答案 1 :(得分:2)

您可以使用正则表达式来完成此任务。 a|b|c形式的正则表达式与abc中的任何一个匹配。所以,你需要一些形式:

import re
p = re.compile('|'.join(mykeys))
return bool(p.search(result))

p.search(result)在整个字符串中搜索正则表达式的匹配项;如果存在,它返回一个匹配(即true-y),否则返回None(这是假y)。将结果转换为bool,如果匹配则为True,否则为False

把这些放在一起,你就有了:

import re

def test_result(result, mykeys):
  p = re.compile('|'.join(mykeys))
  return bool(p.search(result))

您还可以通过不预编译正则表达式来使其更简洁;如果是一次性使用,这应该没问题:

def test_result(result, mykeys):
  return bool(re.search('|'.join(mykeys), result))

供参考,请阅读Python's re library

答案 2 :(得分:2)

你的功能做了两件事,打印并返回结果。你可以这样打破它们:

def test_result(result, mykeys):
    return [k in result for k in mykeys]

def print_results(results):
    for result in results:
        print("found a match for " + result)

test_result将返回包含所有找到的键或空列表的列表。空列表是假的,因此您可以将它用于您想要的任何测试。只有在你真正想要打印时才需要print_results,否则你可以在其他函数中使用结果。

如果您只想查看在线状态并且不关心您找到的密钥,可以执行以下操作:

def test_result(result, my_keys):
    return any(map(lambda k: k in result, mykeys))

如果您正在使用python3(就像您应该这样),我相信这将是懒惰的,并且只根据需要评估列表的大部分内容。

有关此最后一项功能的更简洁版本,请参阅A more concise way to write this Python code

答案 3 :(得分:0)

要搜索列表中的元素,可以使用for-else语句。特别是,这允许返回找到的元素。

def test_result (result, mykeys):
   for keyword in mykeys:
     if keyword in result: break
   else:
       return None
   return keyword

print(test_result("grep says awk", ['sed', 'foo', 'awk'])) # 'awk'
print(test_result("grep says awk", ['bar', 'foo'])) # None