我想要做的是,如果我有一个列表:
["lime", "mile", "liem", "tag", "gat", "goat", "math"]
我想编写一个函数,返回列表中包含anagram的单词,如下所示:
["lime", "mile", "liem", "tag", "gat",]
到目前为止,我有这段代码:
def anagramprinter(x):
output = []
for i in x:
for n in i:
if n in x[i]:
我不能超越这一部分,希望得到一些帮助,也希望得到彻底的解释。
有人可以告诉我一种不涉及进口的方式吗? 感谢
感谢。
答案 0 :(得分:4)
通过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']]
输出还不是你想要的,但是如果您愿意,可以很容易地压缩该列表。
评论后更新:
上面的解决方案不会处理重复字符的单词。但这会(这次字典的关键字只是由排序字母组成的字符串):
for word in wordlist:
worddict[''.join(sorted(word))].append(word)
答案 1 :(得分:1)
分析anagram单词的简单方法是按字母顺序排列。所以你创建了第二个带有字母排序单词的列表。
['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代码,但我认为对你来说重要的是在单词中订购字母。
现在你可以做一些事情来分析你的字谜
答案 2 :(得分:0)
这是一个不错的开始(尽管如果你将变量命名为'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
这很接近,但实际上还不够,因为要成为一个真正的字谜你必须有相同数量的每个字母出现,而不只是相同的一组不同的字母(考虑'邮件'与'milla'或'mailmailmail')。
这样做的一种方法是制作w2的副本,然后当你浏览w1的字符时,删除该副本中与w1的每个字母匹配的字母。那样它不能匹配两次。并且,当你完成'c'循环时,你需要确保副本变空。
还有很多其他方法;一些聪明的涉及“集合”类型,如set和multiset。正如Wise船长建议的那样,按字母顺序对每个单词中的字符进行排序可以让你只比较它们,而不是一次循环一个字符。
希望有所帮助。
-s
答案 3 :(得分:0)
您可以使用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', 'ancestries'
这样的长话
答案 4 :(得分:0)
检查python中两个单词是否为字谜的算法。
1)取两个词:例如
("mile", "lime")
("tiles", "miles")
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_array[i]
是否second_array[i]
== 0<=i<=len(first_array)||second_array
5)结论。如果持有4),则返回true,否则返回false。
from itertools import combinations
def anagram(w1,w2):
list1 = list(w1)
list2 = list(w2)
list1.sort()
list2.sort()
idx = 0
is_anagram = True
while idx < len(w1) and is_anagram:
if list1[idx]== list2[idx]:
idx += 1
else:
is_anagram = False
return is_anagram
lst_words = ["lime", "mile", "liem", "tag", "gat", "goat", "math"]
lst_anagrams = set()
for i in combinations(lst_words, 2):
if anagram(*i):
lst_anagrams |= set(i)
print list(lst_anagrams)
答案 5 :(得分:0)
检查两个给定的字符串是否为“字谜”。这些字符串可能包含空格,数字或特殊字符
#First of all define a function that counts the number of alphabets in a string. It'll be used as a final condition to check for anagrams
def count_alpha(text):
text = text.lower()
count = 0
i = 97 #ASCII code range from 'a' to 'z' is 97 to 122
while i < 123:
if chr(i) in text:
count += text.count(chr(i))
i += 1
return count
text1 = input('Enter your First Word: ')
text2 = input('Enter your Second Word: ')
#replace all the spaces with empty strings and make the string lower case
text1 = text1.replace(' ','').lower()
text2 = text2.replace(' ','').lower()
i = 97
while i < 123:
#check if an alphabet count in both strings is the same.
if text1.count(chr(i)) == text2.count(chr(i)):
#replace all the alphabets with spaces
text1 = text1.replace(chr(i),' ')
text2 = text2.replace(chr(i),' ')
i += 1
#since all the alphabets have been replaced by spaces. There's no alphabet left(if they had the same number of particular alphabets)
if count_alpha(text1) == 0 and count_alpha(text2) == 0:
print('They are anagrams')
else: print('They are not anagrams')
所以这是你的代码。享受!
答案 6 :(得分:0)
def does_string_contain(big_word, small_word) :
list_string = list(big_word)
for char in small_word:
if char in list_string:
list_string.pop(list_string.index(char))
else:
return False
for char in small_word:
if char in list_string:
return False
return True