Как отсортировать список по значениям другого списка?

Допустим дан список [4, 3, 7, 'dfg'] нужно отсортировать этот список в порядке другого списка [1, 2, 3, 4], а если значения не совпадают поместить их в конец. То есть должно получится [3, 4, 7, 'dfg']


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

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

Вообще задачка прикольная, поэтому вот вам однострочник (не самый эффективный, но рабочий). Я просто задал ключ сортировки согласно описанию задачи:

l1 = [4, 3, 7, 'dfg']
l2 = [1, 2, 3, 4]

print(sorted(l1, key=lambda x: l2.index(x) if x in l2 else len(l2)))

Вывод:

[3, 4, 7, 'dfg']

Хотя учебные задачи вам бы надо решать самому, чтобы чему-то научиться, они для этого и даются.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Идеи те же что и в ответе CrazyElf. Промежуточный словарь обеспечивает производительность при длинных списках:

l1 = [4, 3, 7, 'dfg']
l2 = [1, 2, 3, 4]

# отображает значения на индексы
keys = {v: i for i, v in enumerate(l2)}

# индекс для значений вне списка
last_key = len(l2)

# сортирует по индексам, ненайденные значения скапливаются в конце
print(sorted(l1, key=lambda v: keys.get(v, last_key)))
[3, 4, 7, 'dfg']
→ Ссылка