Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最有效的方法-测试2个字符串的字谜_Python_Python 3.x_String_Iteration - Fatal编程技术网

Python 最有效的方法-测试2个字符串的字谜

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中的字母: 如果字母不在

有很多种方法。然而,我想知道是否有一种方法可以只对每个单词重复一次?如果不是的话,在Python中最有效的方法是什么

我们可以遍历第二个字符串,检查第一个字符串中是否存在每个字符。然而,当调用内置方法时,在最坏的情况下,这会给我们在第一个字符串上进行n-1次迭代

def是第1条,第2条: chceck如果长度相同 如果lenstr_1!=lenstr_2: 返回错误 其他: 所有字符小写 str1,str2=liststr_1.更低,liststr_2.更低 对于str1中的字母: 如果字母不在str2中: 返回错误 str2.removeletter 返回真值
还有别的办法吗?

也许可以用字典

编辑:增加了丹的建议

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有一个新字符,那么您也会丢失提前退出。