Встроенный sorted
с пользовательским ключом может сделать это за вас:
sorted(ciphertext, key=lambda x: unsorted_key.index(sorted_key[ciphertext.index(x)]))
Вывод:
[['x', 'h', 'm', 's'],
['e', 'r', 'm', 'e'],
['u', 't', 'x', 'e'],
['l', 'x', 'c', 'x'],
['x', 'c', 'y', 'a'],
['y', 'y', 'e', 'x'],
['t', 'u', 'o', 'x'],
['p', 'r', 'k', 'p'],
['v', 'n', 'x', 'a'],
['n', 'h', 'e', 'x']]
Лямбда в основном сводится к:
- Найти текущий индекс
- Найти значение текущего индекса в
sorted_key
- Найти индекс
sorted_key
в unsorted_key
- Сортировать его
Единственное, в чем я не совсем уверен, так это зачем вам "сортировать" sorted_key
, если конечный результат идентичен unsorted_key
?Просто sorted_key = unsorted_key[:]
достаточно просто, если это так.Но если вам действительно нужно также отсортировать sorted_key
, вы можете сделать это (на самом деле lambda
будет проще):
ciphertext, sorted_key = map(list, zip(*sorted(zip(ciphertext, sorted_key), key=lambda x: unsorted_key.index(x[1]))))
ciphertext
[['x', 'h', 'm', 's'],
['e', 'r', 'm', 'e'],
['u', 't', 'x', 'e'],
['l', 'x', 'c', 'x'],
['x', 'c', 'y', 'a'],
['y', 'y', 'e', 'x'],
['t', 'u', 'o', 'x'],
['p', 'r', 'k', 'p'],
['v', 'n', 'x', 'a'],
['n', 'h', 'e', 'x']]
sorted_key
['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p']