Читаемое однострочное решение:
output = [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
Например:
>>> words = ['abc', 'cab', 'cafe', 'goo', 'face']
>>> from itertools import groupby
>>> [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
[['abc', 'cab'], ['cafe', 'face'], ['goo']]
Главное здесь - использовать itertools.groupby
из модуля itertools
, который сгруппирует элементы в списке вместе.
Список, который мы поставляем groupby
, должен быть отсортирован заранее, поэтому мы передаем его sorted(words,key=sorted)
.Хитрость в том, что sorted
может принимать ключевую функцию и будет сортировать на основе выходных данных этой функции, поэтому мы снова передаем sorted
в качестве ключевой функции, и это будет сортировать слова, используя буквы строки в порядке,Нет необходимости определять нашу собственную функцию или создавать lambda
.
groupby
берет ключевую функцию, которую она использует, чтобы сказать, должны ли элементы быть сгруппированы вместе, и снова мы можем просто передать ее встроеннойsorted
function.
Последнее, что следует отметить, это то, что выходные данные представляют собой пары ключевых и групповых объектов, поэтому мы просто берем объекты группировщика и используем функцию list
для преобразования каждого из них в список..
(Кстати, я бы не назвал вашу переменную input
как тогда вашу скрытую встроенную input
функцию , хотя, вероятно, вам не следует использовать ее.)