Python|从给定列表中分组字谜
字谜是由相似元素组成的单词,但这些字符出现的顺序不同。有时,我们可能会遇到需要对字谜进行分组的问题,因此解决上述问题总是有帮助的。让我们讨论一些可以做到这一点的方法。
方法 #1:使用 defaultdict() + sorted() + values()
上述功能的组合可用于解决上述问题。在此,我们首先使用 defaultdict 将 anagrams 分组,并使用 sorted函数获取每个 anagram root 值以对 anagrams 进行分组。
Python3
# Python3 code to demonstrate
# Grouping Anagrams
# using defaultdict() + sorted() + values()
from collections import defaultdict
# initializing list
test_list = ['lump', 'eat', 'me', 'tea', 'em', 'plum']
# printing original list
print("The original list : " + str(test_list))
# using defaultdict() + sorted() + values()
# Grouping Anagrams
temp = defaultdict(list)
for ele in test_list:
temp[str(sorted(ele))].append(ele)
res = list(temp.values())
# print result
print("The grouped Anagrams : " + str(res))
Python3
# Python3 code to demonstrate
# Grouping Anagrams
# using list comprehension + sorted() + lambda + groupby()
from itertools import groupby
# initializing list
test_list = ['lump', 'eat', 'me', 'tea', 'em', 'plum']
# printing original list
print("The original list : " + str(test_list))
# using list comprehension + sorted() + lambda + groupby()
# Grouping Anagrams
temp = lambda test_list: sorted(test_list)
res = [list(val) for key, val in groupby(sorted(test_list, key = temp), temp)]
# print result
print("The grouped Anagrams : " + str(res))
Python3
data = ['eat', 'ate', 'tea', 'ant', 'tan',
'bat', 'adobe', 'abode', 'listen', 'silent']
def createAnagramKey(string):
key = ''
for ch in sorted(string):
key += ch
return str(key)
def groupAnagramWords(data):
group = dict()
for ele in data:
if group.get(createAnagramKey(ele)) == None:
group[createAnagramKey(ele)] = [ele]
else:
group[createAnagramKey(ele)].append(ele)
return group
anagram_grouped = groupAnagramWords(data)
# Anagram in dictonry format
print('In dictonry format')
print(anagram_grouped)
anagram_grouped_list = list()
for k, v in anagram_grouped.items():
anagram_grouped_list.append(v)
print('In list format')
print(anagram_grouped_list)
输出 :
The original list : ['lump', 'eat', 'me', 'tea', 'em', 'plum']
The grouped Anagrams : [['me', 'em'], ['lump', 'plum'], ['eat', 'tea']]
方法 #2:使用列表理解 + sorted() + lambda + groupby()
上述函数的组合也可用于执行此特定任务。 groupby函数执行必要的分组。 lambda函数有助于对相似的字谜进行分组。
Python3
# Python3 code to demonstrate
# Grouping Anagrams
# using list comprehension + sorted() + lambda + groupby()
from itertools import groupby
# initializing list
test_list = ['lump', 'eat', 'me', 'tea', 'em', 'plum']
# printing original list
print("The original list : " + str(test_list))
# using list comprehension + sorted() + lambda + groupby()
# Grouping Anagrams
temp = lambda test_list: sorted(test_list)
res = [list(val) for key, val in groupby(sorted(test_list, key = temp), temp)]
# print result
print("The grouped Anagrams : " + str(res))
输出 :
The original list : ['lump', 'eat', 'me', 'tea', 'em', 'plum']
The grouped Anagrams : [['me', 'em'], ['lump', 'plum'], ['eat', 'tea']]
方法3:使用简单的Python编程
下面是一个以简单的Python编程方式将字谜单词组合在一起的程序。不使用列表理解或 lambda 或导入的方法。
遵循的方法很简单——
1.对每个单词进行排序,将排序后的单词作为字典键
2.根据排序键继续向字典中添加新单词
Python3
data = ['eat', 'ate', 'tea', 'ant', 'tan',
'bat', 'adobe', 'abode', 'listen', 'silent']
def createAnagramKey(string):
key = ''
for ch in sorted(string):
key += ch
return str(key)
def groupAnagramWords(data):
group = dict()
for ele in data:
if group.get(createAnagramKey(ele)) == None:
group[createAnagramKey(ele)] = [ele]
else:
group[createAnagramKey(ele)].append(ele)
return group
anagram_grouped = groupAnagramWords(data)
# Anagram in dictonry format
print('In dictonry format')
print(anagram_grouped)
anagram_grouped_list = list()
for k, v in anagram_grouped.items():
anagram_grouped_list.append(v)
print('In list format')
print(anagram_grouped_list)
输出:
In dictonry format
{'aet': ['eat', 'ate', 'tea'], 'ant': ['ant', 'tan'], 'abt': ['bat'],
'abdeo': ['adobe', 'abode'], 'eilnst': ['listen', 'silent']}
In list format
[['eat', 'ate', 'tea'], ['ant', 'tan'], ['bat'], ['adobe', 'abode'], ['listen', 'silent']]