Отсортировать один список по другому с доп. условиями
Есть 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 шт):
Если нужно по частичному совпадению, тогда:
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']]
Ещё вариант для разнообразия - делаем из списка 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']]