Python 最有效的方法-测试2个字符串的字谜
有很多种方法。然而,我想知道是否有一种方法可以只对每个单词重复一次?如果不是的话,在Python中最有效的方法是什么 我们可以遍历第二个字符串,检查第一个字符串中是否存在每个字符。然而,当调用内置方法时,在最坏的情况下,这会给我们在第一个字符串上进行n-1次迭代 def是第1条,第2条: chceck如果长度相同 如果lenstr_1!=lenstr_2: 返回错误 其他: 所有字符小写 str1,str2=liststr_1.更低,liststr_2.更低 对于str1中的字母: 如果字母不在str2中: 返回错误 str2.removeletter 返回真值Python 最有效的方法-测试2个字符串的字谜,python,python-3.x,string,iteration,Python,Python 3.x,String,Iteration,有很多种方法。然而,我想知道是否有一种方法可以只对每个单词重复一次?如果不是的话,在Python中最有效的方法是什么 我们可以遍历第二个字符串,检查第一个字符串中是否存在每个字符。然而,当调用内置方法时,在最坏的情况下,这会给我们在第一个字符串上进行n-1次迭代 def是第1条,第2条: chceck如果长度相同 如果lenstr_1!=lenstr_2: 返回错误 其他: 所有字符小写 str1,str2=liststr_1.更低,liststr_2.更低 对于str1中的字母: 如果字母不在
还有别的办法吗?也许可以用字典 编辑:增加了丹的建议
word1 = 'ahbgrettf'
word2 = 'arethbfgt'
def is_anagram(word1, word2):
if (len(word1) != len(word2)):
return False
word_dic = {}
# n iterations
for char in word1:
if word_dic.get(char):
word_dic[char] += 1
else:
word_dic[char] = 1
# n iterations
for char in word2:
if word_dic.get(char):
word_dic[char] -= 1
else:
return False
# n iterations
for v in word_dic.values():
if v != 0:
return False
return True
print(is_anagram(word1, word2))
总数:3n?可能是字典 编辑:增加了丹的建议
word1 = 'ahbgrettf'
word2 = 'arethbfgt'
def is_anagram(word1, word2):
if (len(word1) != len(word2)):
return False
word_dic = {}
# n iterations
for char in word1:
if word_dic.get(char):
word_dic[char] += 1
else:
word_dic[char] = 1
# n iterations
for char in word2:
if word_dic.get(char):
word_dic[char] -= 1
else:
return False
# n iterations
for v in word_dic.values():
if v != 0:
return False
return True
print(is_anagram(word1, word2))
总计:3n?如果您可以使用Collections.Counter,那么它就变得简单了,因为如果两个单词是字谜,它们将具有相同的键和值
from collections import Counter
def is_anagram(word1,word2):
return Counter(word1)==Counter(word2)
word1 = 'ahbgrettf'
word2 = 'arethbfgt'
print(is_anagram(word1,word2)
为了补充@Maxime的答案,如果我们使用defaultdict,我们不必检查键是否存在,然后检查键是否匹配,值是否匹配,以确定它是否是一个字谜
from collections import defaultdict
def is_anagram(word1,word2):
table1, table2 = defaultdict(int), defaultdict(int)
for c in word1:
table1[c]+=1
for c in word2:
table2[c]+=1
if set(table1.keys()) == set(table2.keys()):
for k, v in table1.items():
if table2[k]!=v:
return False
else:
return False
return True
print(is_anagram('ahbgrettf','arethbfgt'))
若你们能使用Collections.Counter,那个么它就变得简单了,因为若两个单词是字谜,它们将有相同的键和值
from collections import Counter
def is_anagram(word1,word2):
return Counter(word1)==Counter(word2)
word1 = 'ahbgrettf'
word2 = 'arethbfgt'
print(is_anagram(word1,word2)
为了补充@Maxime的答案,如果我们使用defaultdict,我们不必检查键是否存在,然后检查键是否匹配,值是否匹配,以确定它是否是一个字谜
from collections import defaultdict
def is_anagram(word1,word2):
table1, table2 = defaultdict(int), defaultdict(int)
for c in word1:
table1[c]+=1
for c in word2:
table2[c]+=1
if set(table1.keys()) == set(table2.keys()):
for k, v in table1.items():
if table2[k]!=v:
return False
else:
return False
return True
print(is_anagram('ahbgrettf','arethbfgt'))
您可以使用defaultdict设置默认值,创建字母频率字典,并使用O3n的另一个字符串从中减去
from collections import defaultdict
def is_anagram2(str_1, str_2):
#check if same length
if (len(str_1) != len(str_2)):
return False
#creates a dictionary with default value of 0 for all keys
str_1_dict = defaultdict(int)
#adds how many of each letter in the dictionary
for i in str_1:
str_1_dict[i] += 1
#subracts how many of each letter in the dictionary
for i in str_2:
str_1_dict[i] -= 1
#checks to make sure all values are 0 (same number of each letter in both strings)
for i in str_1_dict:
if not str_1_dict[i] == 0:
return False
return True
is_anagram2('aaaa','aaaa')
您可以使用defaultdict设置默认值,创建字母频率字典,并使用O3n的另一个字符串从中减去
from collections import defaultdict
def is_anagram2(str_1, str_2):
#check if same length
if (len(str_1) != len(str_2)):
return False
#creates a dictionary with default value of 0 for all keys
str_1_dict = defaultdict(int)
#adds how many of each letter in the dictionary
for i in str_1:
str_1_dict[i] += 1
#subracts how many of each letter in the dictionary
for i in str_2:
str_1_dict[i] -= 1
#checks to make sure all values are 0 (same number of each letter in both strings)
for i in str_1_dict:
if not str_1_dict[i] == 0:
return False
return True
is_anagram2('aaaa','aaaa')
为什么不对你链接的问题中的方法进行基准测试?我的钱花在了使用计数器的方法上,为什么不对你所链接的问题中的方法进行基准测试呢?我的钱花在使用计数器的方法上。如果长度不匹配,你也可以提前退出。如果长度不匹配,你也可以提前退出。Maxime的答案使用了一个字典,因此它在空间上比defaultdict方法更有效,不会损失计算效率。如果单词2有一个新的字符,你也会失去提前退出的机会。Maxime的答案使用了一个字典,因此它在空间上比defaultdict方法更有效,不会损失计算效率。如果word 2有一个新字符,那么您也会丢失提前退出。