试着想出python的字谜函数

试着想出python的字谜函数,python,anagram,Python,Anagram,我想做的是,如果我有一个如下列表: ["lime", "mile", "liem", "tag", "gat", "goat", "math"] 我想写一个函数,返回列表中有一个字谜的单词,如下所示: ["lime", "mile", "liem", "tag", "gat",] 到目前为止,我有以下代码: def anagramprinter(x): output = [] for i in x: for n in i:

我想做的是,如果我有一个如下列表:

["lime", "mile", "liem", "tag", "gat", "goat", "math"]
我想写一个函数,返回列表中有一个字谜的单词,如下所示:

["lime", "mile", "liem", "tag", "gat",]
到目前为止,我有以下代码:

def anagramprinter(x):

    output = []     
    for i in x:
        for n in i:
            if n in x[i]:
我不能通过这一部分,希望得到一些帮助,也希望得到一个彻底的解释

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


谢谢。

通过字符的
冻结集来识别单词的方法:

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']]
输出还不是您想要的,但是如果您愿意的话,将列表展平是很容易的


评论后更新

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


通过字符的
冻结集
识别单词的方法:

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']]
输出还不是您想要的,但是如果您愿意的话,将列表展平是很容易的


评论后更新

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


分析拼字法单词的简单方法是按字母顺序排列。因此,您可以创建第二个按字母顺序排列的单词列表

['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']
我想你可以有比我给你的更多的pythonesque代码,但我认为对你来说重要的是在单词中排列字母


现在你可以做一些事情来分析你的字谜了

分析字谜单词的简单方法是按字母顺序排列。因此,你可以用字母顺序排列的单词创建第二个列表

['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']
我想你可以有比我给你的更多的pythonesque代码,但我认为对你来说重要的是在单词中排列字母

现在,您可以做一些事情来分析您的字谜了,这是一个不错的开始(尽管如果您将变量命名为'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”或“mailmail”)

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

还有很多其他的方法;一些聪明的方法涉及“集合”类型,如集合和多集合。正如Wise船长所建议的,按字母顺序排列每个单词中的字符可以让你比较它们,而不是一次循环一个字符

希望有帮助

-这是一个不错的开始(不过如果将变量命名为'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”或“mailmail”)

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

还有很多其他的方法;一些聪明的方法涉及“集合”类型,如集合和多集合。正如Wise船长所建议的,按字母顺序排列每个单词中的字符可以让你比较它们,而不是一次循环一个字符

希望有帮助


-s

您可以使用itertools创建单词的所有排列,删除刚找到排列的单词,然后逐个检查列表中的一个单词,查看是否存在类似排列

from itertools import permutations

l = ["lime", "mile", "liem", "tag", "gat", "goat", "math"]
final = []
perms = []
for i in l:
    perms += [''.join(p) for p in permutations(i)]
    perms.remove(i)

for i in l:
    if i in perms:
        final.append(i)
print final

这并不是世界上最快的解决方案,特别是如果你有像“抵抗”、“祖先”这样的长单词,你可以使用itertools创建所有的单词排列,删除你刚刚找到的单词排列,然后一次检查一个单词列表,看看它是否在这样的排列中

from itertools import permutations

l = ["lime", "mile", "liem", "tag", "gat", "goat", "math"]
final = []
perms = []
for i in l:
    perms += [''.join(p) for p in permutations(i)]
    perms.remove(i)

for i in l:
    if i in perms:
        final.append(i)
print final

这并不是世界上最快的解决方案,特别是如果你有像“resistance”、“conserties”这样的长单词,那么这是一种在python中检查两个单词是否为字谜的算法

1) 用两个词:例如

(“英里”、“石灰”)
(“瓷砖”、“英里”)

2) 制作字符串数组/列表:

(['m',i',l',e'],['l',i',m',e'])
(['t'、'i'、'l'、'e'、's']、['m'、'i'、'l'、'e'、's']))

3) 排序数组

(['e','i','l','m'],['e','i','l','m'])
(['e'、'i'、'l'、's'、't']、['e'、'i'、'l'、'm'、's'])


4) 检查
first\u array[i]
=
second\u array[i]
是否为
0检查两个单词在python中是否为字谜的算法

1) 用两个词:例如

(“英里”、“石灰”)
(“瓷砖”、“英里”)

2) 制作字符串数组/列表:

(['m',i',l',e'],['l',i',m',e'])
(['t'、'i'、'l'、'e'、's']、['m'、'i'、'l'、'e'、's']))

3) 排序数组