📜  Python|从给定列表中分组字谜

📅  最后修改于: 2022-05-13 01:54:54.428000             🧑  作者: Mango

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']]