Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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中两个字符串的字谜测试_Python_Python 3.x - Fatal编程技术网

python中两个字符串的字谜测试

python中两个字符串的字谜测试,python,python-3.x,Python,Python 3.x,问题是: 编写一个名为test_的函数,用于接收两个字符串作为 参数,两者都由字母字符和返回组成 如果两个字符串是字谜,则为True,否则为False。两个字符串是 如果一个字符串可以通过重新排列 另一个字符串中的字符使用 原始字符串只显示一次。例如,弦乐“管弦乐队”和 “Carthorse”是字谜,因为每个字谜都可以由 使用所有字符重新排列另一个中的字符 在其中的一个里面,只有一次。请注意,资本化并不重要 此处,即小写字符可被视为与 大写字符 我的代码: def test_for_anagra

问题是:

编写一个名为test_的函数,用于接收两个字符串作为 参数,两者都由字母字符和返回组成 如果两个字符串是字谜,则为True,否则为False。两个字符串是 如果一个字符串可以通过重新排列 另一个字符串中的字符使用 原始字符串只显示一次。例如,弦乐“管弦乐队”和 “Carthorse”是字谜,因为每个字谜都可以由 使用所有字符重新排列另一个中的字符 在其中的一个里面,只有一次。请注意,资本化并不重要 此处,即小写字符可被视为与 大写字符

我的代码:

def test_for_anagrams (str_1, str_2):
    str_1 = str_1.lower()
    str_2 = str_2.lower()
    print(len(str_1), len(str_2))
    count = 0
    if (len(str_1) != len(str_2)):
        return (False)
    else:
        for i in range(0, len(str_1)):
            for j in range(0, len(str_2)):
                if(str_1[i] == str_2[j]):
                    count += 1
        if (count == len(str_1)):
            return (True)
        else:
            return (False)


#Main Program
str_1 = input("Enter a string 1: ")
str_2 = input("Enter a string 2: ")
result = test_for_anagrams (str_1, str_2)
print (result)

这里的问题是,当我以
乐团
马车
的形式输入字符串时,结果为
。同样的字符串
眼睛和他们看到的
。任何帮助都将不胜感激。

问题在于,您只需检查字符串中是否存在任何字符匹配,然后递增计数器。不考虑已与另一个匹配的字符。这就是为什么以下操作也会失败:

>>> test_for_anagrams('aa', 'aa')
False
即使字符串相等(同样也是一个字谜),您也将第一个字符串的每个
a
与另一个字符串的每个
a
相匹配,因此您有一个
4
的计数,结果是
False

通常,您应该计算每个字符的出现次数,并确保每个字符在每个字符串中出现的频率相同。可以使用对象来计算字符数。然后,您只需检查每个字符串的计数是否相同,这可以通过比较计数器对象(只是字典)轻松做到:


为了完整性:如果只是导入
计数器
并完成练习不符合练习的精神,您可以使用普通字典来计算字母

def test_for_anagrams(str_1, str_2):
    counter1 = {}
    for c in str_1.lower():
        counter1[c] = counter1.get(c, 0) + 1
    counter2 = {}
    for c in str_2.lower():
        counter2[c] = counter2.get(c, 0) + 1

    # print statements so you can see what's going on,
    # comment out/remove at will
    print(counter1)
    print(counter2)

    return counter1 == counter2
演示:

输出:

{' ': 1, 'e': 3, 'h': 1, 's': 1, 't': 1, 'y': 1}
{' ': 1, 'e': 3, 'h': 1, 's': 1, 't': 1, 'y': 1}
True
{'a': 1, 'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
{'a': 1, 'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
True
{'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
{'a': 1, 'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
False

我是python新手,如果我错了,请原谅

我相信这可以用另一种方法完成:对给定的字符串排序,然后比较它们

def anagram(a, b):
  # string to list
  str1 = list(a.lower())
  str2 = list(b.lower())

  #sort list
  str1.sort()
  str2.sort()

  #join list back to string
  str1 = ''.join(str1)
  str2 = ''.join(str2)

  return str1 == str2

print(anagram('Orchestra', 'Carthorse'))

遍历字符串测试并验证字符串test1中存在的天气字符(如果存在),将数据存储在字符串值中。 如果等于返回True,则比较值的长度和test1的长度,否则返回False

def anagram(test,test1):
    value =''
    for data in test:
        if data in test1:
            value +=  data
    if len(value) == len(test1):
        return True
    else:
        return False

anagram("abcd","adbc")
def字谜(测试,测试1): 测试值=[] 如果len(test)=len(test1): 对于测试中的i: 值=test.count(i)=test1.count(i) 测试值。追加(值) 其他: test_value.append(False)


检查test和test1的长度,如果长度匹配,则遍历字符串测试,如果匹配,则比较test和test1字符串中的字符数。如果匹配,则将值存储在字符串中。

我以基本方式编写了易懂的字谜程序

    def compare(str1,str2):
if((str1==None) or (str2==None)):
    print(" You don't enter string .")
elif(len(str1)!=len(str2)):
    print(" Strings entered is not Anagrams .")
elif(len(str1)==len(str2)):
    b=[]
    c=[]
    for i in str1:
        #print(i)
        b.append(i)
    b.sort()
    print(b)
    for j in str2:
        #print(j)
        c.append(j)
    c.sort()
    print(c)
    if (b==c and b!=[] ):
        print(" String entered is Anargama .")
    else:
        print(" String entered are not Anargama.")
else:
    print(" String entered is not Anargama .")
str1=input(" Enter the first String :")
str2=input(" Enter the second String :")

compare(str1,str2)

一种更简洁、更通俗的方法是使用排序键&lower/upper键

您可以先对字符串进行排序,然后使用lower/upper使大小写保持一致,以便进行适当的比较,如下所示:

# Function definition
def test_for_anagrams (str_1, str_2):
    if sorted(str_1).lower() == sorted(str_2).lower():
        return True
    else:
        return False

#Main Program
str_1 = input("Enter a string 1: ")
str_2 = input("Enter a string 2: ")
result = test_for_anagrams (str_1, str_2)
print (result)
另一个解决方案:

def test_for_anagrams(my_string1, my_string2):
    s1,s2 = my_string1.lower(), my_string2.lower()
    count = 0
    if len(s1) != len(s2) :
        return False
    for char in s1 :
        if s2.count(char,0,len(s2)) == s1.count(char,0,len(s1)):
            count = count + 1
    return count == len(s1)

现在没有时间调试您的程序,但这里有一个简短的解决方案:
返回计数器(str_1.lower())==计数器(str_2.lower())
使用
集合中的
计数器
。只需注意-计数器是
集合
模块的一部分。我想贴一个答案,但是@timgeb更快:)你也可以排序然后比较。@pp_u是的,但是这个问题可以而且应该用O(n)来解决。@timgeb我完全同意,把它看作是一个旁注。如果导入不符合练习的精神,那么通过在每个字符串上循环一次,将你自己的计数器构造成一个普通的字典,然后比较它们。谢谢你的解决方案,但我只是在学习python。我不知道什么是集合或计数器。@KaranThakkar应用于字符串的计数器只是一个字典,它记录每个字符在字符串中出现的频率。所以
Counter('barbaz')
会给你一本字典
{'b':2'a':2'r':1'z':1}
<代码>计数器
只负责为您计数;但正如timgeb所说,你可以从一个空字典开始,然后自己循环字符串并计算字符数。从来没有想过这一点。太棒了。欢迎来到堆栈溢出!请尝试提供一个关于您的解决方案如何工作的详细描述。请参阅:。谢谢。这不起作用
anagram(“bab”,“bad”)==True
而它应该是
False
我错过了这个测试用例:def anagram(test,test1):value=''用于索引,data用于枚举(test):if test1中的数据:value+=data if len(value)==len len(test1)和sorted(value)==sorted(test1):返回True否则:返回False
if False in test_value:
    return  False
else:
    return True
    def compare(str1,str2):
if((str1==None) or (str2==None)):
    print(" You don't enter string .")
elif(len(str1)!=len(str2)):
    print(" Strings entered is not Anagrams .")
elif(len(str1)==len(str2)):
    b=[]
    c=[]
    for i in str1:
        #print(i)
        b.append(i)
    b.sort()
    print(b)
    for j in str2:
        #print(j)
        c.append(j)
    c.sort()
    print(c)
    if (b==c and b!=[] ):
        print(" String entered is Anargama .")
    else:
        print(" String entered are not Anargama.")
else:
    print(" String entered is not Anargama .")
str1=input(" Enter the first String :")
str2=input(" Enter the second String :")

compare(str1,str2)
# Function definition
def test_for_anagrams (str_1, str_2):
    if sorted(str_1).lower() == sorted(str_2).lower():
        return True
    else:
        return False

#Main Program
str_1 = input("Enter a string 1: ")
str_2 = input("Enter a string 2: ")
result = test_for_anagrams (str_1, str_2)
print (result)
def test_for_anagrams(my_string1, my_string2):
    s1,s2 = my_string1.lower(), my_string2.lower()
    count = 0
    if len(s1) != len(s2) :
        return False
    for char in s1 :
        if s2.count(char,0,len(s2)) == s1.count(char,0,len(s1)):
            count = count + 1
    return count == len(s1)