Сопоставление 2 списков python
Имеется два списка:
list1 = ['one/two/three', 'four/five/six', 'seven/eight/nine', 'ten/eleven/twelve']
list2 = ['one', 'seven']
Нужно получить на выходе те элементы list1, которые содержат ключи из list2 Элементы из list2 всегда соответствуют первой части элементов из list1
final_list = ['one/two/three', 'seven/eight/nine']
Понятно, что начинать нужно примерно с этого:
splitted = [i.split('/') for i in list1]
Но вот дальше не могу придумать правильный цикл, все закончились ошибкой.
Ответы (4 шт):
Автор решения: MaxU
→ Ссылка
создайте вспомогательный список для поиска по list1:
idx1 = [x.partition("/")[0] for x in list1]
print(idx1)
# ['one', 'four', 'seven', 'ten']
теперь можно легко искать по этому вспомогательному списку:
res = [list1[idx1.index(x2)] for x2 in list2 if x2 in idx1]
результат:
In [8]: res
Out[8]: ['one/two/three', 'seven/eight/nine']
Автор решения: gil9red
→ Ссылка
Пример перебора:
list1 = ['one/two/three', 'four/five/six', 'seven/eight/nine', 'ten/eleven/twelve']
list2 = ['one', 'seven']
final_list = [key for key in list1 if any(x in key for x in list2)]
print(final_list)
# ['one/two/three', 'seven/eight/nine']
Подробнее:
final_list = []
# Перебор ключей
for key in list1:
# Если хоть 1 элемент из list2 есть в ключе
if any(x in key for x in list2):
final_list.append(key)
print(final_list)
# ['one/two/three', 'seven/eight/nine']
Поиск выполняется по всему ключу в list1, если нужно проверять только первый элемент, то в any вместо x in key писать: x == key.split("/")[0]
Автор решения: passant
→ Ссылка
Можно искать, превратив список индексов в набор
plitted = [i.split('/') for i in list1]
set2=set(list2)
for elem in plitted:
if elem[0] in set2:
rez=.append('/'.join(elem))
print(rez)
Результат
['one/two/three', 'seven/eight/nine']
Автор решения: cryer enable
→ Ссылка
вот простенько и понятно
list1 = ['one/two/three', 'four/five/six', 'seven/eight/nine', 'ten/eleven/twelve','ones/eleven/twelve']
list2 = ['one', 'seven',]
final_list = []
for elem in list1:
if elem.split('/')[0] in list2: # elem.split('/')[0] получаем массив и берем первый элемент этого массива
final_list.append(elem)