Как отфильтровать список без преобразования в строку или зациклить его - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть объект типа list и второй объект типа string.Я хотел бы отфильтровать все значения в объекте списка, которые не соответствуют значению объекта строки.

Я создал цикл, который разбивает список на строки и с помощью регулярных выражений находит все не соответствующиеи добавил эти результаты в новый список.В этом примере используются имена хостов "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?

1 Ответ

2 голосов
/ 26 апреля 2019

Вы можете создать 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))

Оба ведут себя одинаково

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...