Отсортировать один список по другому с доп. условиями

Есть 2 списка (одн-ый, мног-ый). Нужно отсортировать второй список по первому (объеденить эти элементы списка в один). Чтобы элементы первого, соответствовали значениям второго и наоборот второй=первому. Но есть одно если во втором списке есть элемент, который содержит в конце символ подчеркивания (_), то нужно считать его правильным и он должен входить в список.

lst1 = ['DAY', 'MONTH', 'CLASS', 'ID']
lst2 = [['DAY', '01'], ['MONTH', '07'], ['DELETED', 'N'], ['ID_', '33']]

Должно получиться как то так

lst_end = [['DAY', '01'], ['MONTH', '07'], ['ID_', '33']]

Я нашел такой вариант

lst_end = sorted(filter(lambda x: x[0] in lst1, lst2),
                     key=lambda x: lst1.index(x[0]))

Но он исключает элемент ID_ Есть ли какой то просто вариант не исключать такие элементы при фильтрации.


Ответы (2 шт):

Автор решения: gil9red

Если нужно по частичному совпадению, тогда:

lst1 = ['DAY', 'MONTH', 'CLASS', 'ID']
lst2 = [['DAY', '01'], ['MONTH', '07'], ['DELETED', 'N'], ['ID_', '33']]

lst_end = [
    [name, value] for name, value in lst2 
    if any(name.startswith(x) for x in lst1)
]
print(lst_end)

Результат:

[['DAY', '01'], ['MONTH', '07'], ['ID_', '33']]
→ Ссылка
Автор решения: CrazyElf

Ещё вариант для разнообразия - делаем из списка 1 множество, чтобы быстрее проверки на вхождение работали, и добавляем в него такие же элементы, но с подчёркиванием:

set1 = set(lst1) | set(f'{x}_' for x in lst1)
lst_new = list(filter(lambda x: x[0] in set1, lst2))
print(lst_new)
# [['DAY', '01'], ['MONTH', '07'], ['ID_', '33']]
→ Ссылка