Я считаю, что это пока единственное представление, в котором не используется ни встроенная перестановка, ни случайная случайная выборка / сортировка. Хотя он длиннее, я думаю, что алгоритм довольно аккуратный.
lambda L:[p for s in L for i,c in enumerate(s)for p in[c+s[:i]+s[i+1:]]if~-(p in L)][0]
Попробуйте онлайн!
объяснение
То, что мы делаем, в основном это:
def unique_anagram(string_list):
for string in string_list:
for i, char in enumerate(string):
# Move the character to the beginning of the string
permutation = char + string[:i] + string[i+1:]
if permutation not in string_list:
return permutation
Вот доказательство того, что это работает:
Для строки Sопределите front(S)набор строк, полученный путем выбора одного символа из Sи перемещения его в начало S. Например, front(ABCDE)есть {ABCDE, BACDE, CABDE, DABCE, EABCD}.
Теперь рассмотрим список анаграмм L, который Lне содержит всех возможных анаграмм (согласно описанию проблемы). Мы хотим показать , что существует строка Sв Lтаким образом, что front(S)содержит , по меньшей мере , один анаграмму , S'который не в L.
Предположим в противоречие, что для каждой строки Sв L, каждая строка в front(S)также в L. Заметьте, что мы можем сгенерировать произвольную перестановку любой строки с помощью серии «фронтовых» ходов. Например, чтобы получить
ABCDE -> BAEDC
мы можем сделать
ABCDE -> CABDE -> DCABE -> EDCAB -> AEDCB -> BAEDC
Мы предположили , что для каждого Sдюйма L, каждый S'в front(S)также в L. Это также означает , что каждый S''в front(S')находится в L, и так далее. Следовательно, если Sнаходится в L, каждая перестановка Sтакже в L. Тогда Lдолжен быть полный набор анаграмм, противоречие.
Таким образом, поскольку мы гарантировали , что существует по крайней мере одна перестановка не в L, должна существовать строка Sв Lтечение которых некоторые S'в front(S)это не L. QED.
Код перебирает front(S)для каждого Sв Lи выбирает S'который не находится в L. По приведенному выше результату будет хотя бы один, S'который соответствует требованиям.
itertoolsли ответ?