如何在不转换为字符串或循环的情况下过滤列表

时间:2019-04-26 09:27:27

标签: python python-3.x filter

我有一个列表类型的对象和第二个字符串类型的对象。 我想过滤列表对象中与字符串对象的值不匹配的所有值。

我创建了一个循环,将列表分成字符串,并用正则表达式找到了所有不匹配的内容,并将这些结果添加到了新列表中。 本示例使用主机名“ ma-tsp-a01”,“ ma-tsp-a02”和“ ma-tsp-a03”。 目前,我会在这个新列表上做进一步的工作,以创建干净的主机名列表。

import re
local_hostname = 'ma-tsp-a01'
profile_files = ['/path/to/file/TSP_D01_ma-tsp-a01\n', \
'/path/to/file/TSP_D02_ma-tsp-a02\n', \
'/path/to/file/TSP_ASCS00_ma-tsp-a01\n', \
'/path/to/file/TSP_DVEBMGS03_ma-tsp-a03\n', \
'/path/to/file/TSP_DVEBMGS01_ma-tsp-a01\n']
result_list = [local_hostname]
for list_obj in profile_files:
    if re.search(".*\w{3}\_\w{1,7}\d{2}\_(?!"+local_hostname+").*", list_obj):
        result_list.append(list_obj.split("/")[-1].splitlines()[0].\
split("_")[-1])
print(result_list)

最后我得到以下输出 ['ma-tsp-a01', 'ma-tsp-a02', 'ma-tsp-a03']。这正是我要搜索的内容。但是有没有办法在没有“ for”循环的情况下以更Python化的方式做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以创建一个filter对象:

filtered = filter(lambda x: re.search(".*\w{3}\_\w{1,7}\d{2}\_(?!"+local_hostname+").*", x), profile_files)

或使用生成器理解:

filtered = (x for x in profile_files if re.search(".*\w{3}\_\w{1,7}\d{2}\_(?!"+local_hostname+").*", x))

两者的行为相同