尝试使用python anagram函数

2024-05-20 17:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的是如果我有一个清单,比如:

["lime", "mile", "liem", "tag", "gat", "goat", "math"]

我想写一个函数,返回列表中有一个anagram的单词,如下所示:

^{pr2}$

到目前为止,我有这个代码:

def anagramprinter(x):

    output = []     
    for i in x:
        for n in i:
            if n in x[i]:

我不能通过这一部分,希望得到一些帮助,也希望能有一个彻底的解释。在

谁能告诉我一种不涉及进口的方法吗? 谢谢

谢谢。在


Tags: 函数代码in列表fortagmath单词
3条回答

分析字谜的简单方法是按字母顺序排列命令。所以使用字母顺序单词创建第二个列表。在

['lime', 'mile', 'liem', 'tag', 'gat']

index = 0
b = []
for i in a:
    b.insert(index, ''.join(sorted(i)))
    index = index + 1

['eilm', 'eilm', 'eilm', 'agt', 'agt']

我认为你可以拥有比我给你的更多的Python编码,但我认为对你来说最重要的是在单词中排序。在

现在你可以做些什么来分析你的字谜了

一种通过字符frozenset识别单词的方法:

from collections import defaultdict

wordlist = ["lime", "mile", "liem", "tag", "gat", "goat", "math"]

worddict = defaultdict(list) 
for word in wordlist:
    worddict[frozenset(word)].append(word)

anagrams = [words for words in worddict.values() if len(words) > 1]
print(anagrams)

# [['lime', 'mile', 'liem'], ['tag', 'gat']]

输出还不是您想要的,但是如果您愿意的话,扁平化列表是很容易的。在


更新评论后:

上面的解决方案不能很好地处理具有重复字符的单词。但这将(这次字典的键只是由排序后的字母组成的字符串):

^{pr2}$

这是一个不错的开始(不过,如果将变量命名为“wordlist”、“word”(甚至是“w”)和“char”或“c”。但有几个问题:

1:对于每个单词('i'),你需要比较其他单词,希望至少找到一个是i的变音图

2:你需要看看有没有找到字符。在

你可以这样开始:

output = []     
for w1 in wordlist:
    for w2 in wordList:
        if w1==w2: continue  # don't compare to self
        match = True  # hope for the best
        for c in w1:
            if c not in w2: 
                match = False
                break
        if (match):
           output.append(w1)
           break

这很接近,但实际上还不够,因为要成为一个真正的字谜,每个字母的出现次数必须相同,而不仅仅是同一组不同的字母(比如“mail”与“milla”或“mailmailmail”)。在

一种方法是复制w2,然后在遍历w1的字符时,删除该副本中与w1的每个字母匹配的字母。那样就不能匹配两次了。而且,当你完成“c”循环时,你需要确保副本已经变空。在

还有许多其他的方法;一些聪明的方法涉及“集合”类型,如set和multiset。正如怀斯上尉建议的那样,按字母顺序对每个单词中的字符进行排序可以让你只对它们进行比较,而不是一次只循环一个字符。在

希望有帮助。在

-s型

相关问题 更多 >