Здесь объединяются оба порядка появления с возможностью их не сгруппированы вместе:
anagram_list = ['cat','aba','baa','aab','tac','sos','oss','act']
first_anagrams = {}
anagram_dict = {}
for word in anagram_list:
sorted_word = ''.join(sorted(word))
if sorted_word in first_anagrams:
anagram_dict[first_anagrams[sorted_word]].append(word)
else:
first_anagrams[sorted_word] = word
anagram_dict[word] = []
print(anagram_dict)
Выход
{'aba': ['baa', 'aab'], 'sos': ['oss'], 'cat': ['tac', 'act']}
где ключ всегда является первой анаграммой в порядке появления, и алгоритм строго O(n)
для n
слов пренебрежимо длинной длины.
Если вам нужны все анаграммы в списке, включая первую, это становится намного проще:
anagram_list = ['cat','aba','baa','aab','tac','sos','oss','act']
first_anagrams = {}
anagram_dict = defaultdict(list)
for word in anagram_list:
anagram_dict[first_anagrams.setdefault(''.join(sorted(word)), word)].append(word)
Результат
defaultdict(<type 'list'>,
{'aba': ['aba', 'baa', 'aab'], 'sos': ['sos', 'oss'], 'cat': ['cat', 'tac', 'act']})