来自 Educative.io 第一次考试“从头开始学习 Python 3”:
检测字符串模式
在此编码练习中,您需要编写一个名为 detector_pattern 的函数主体,该函数根据两个字符串是否具有相同的字符模式返回 true 或 false。更准确地说,如果两个字符串具有相同的长度,并且第一个字符串中的两个字符相等当且仅当第二个字符串中相应位置的字符也相等时,它们具有相同的模式。
以下是相同模式和不同模式的一些示例:
第一弦 | 第二根弦 | 同款 |
---|---|---|
“” | “” | 正确 |
“一个” | “一个” | 正确 |
“×” | “y” | 正确 |
“ab” | “xy” | 正确 |
“阿巴” | “xyz” | 错误 |
“- - -” | “xyz” | 错误 |
“- - -” | “啊啊” | 正确 |
“xyzxyz” | “脚趾” | 正确 |
“xyzxyz” | “托托亚” | 错误 |
“aaabbbcccd” | “eeefffggz” | 正确 |
“cbacbacba” | “xyzxyzxyz” | 正确 |
“abcdefghijk” | “lmnopqrstuv” | 正确 |
“asasasasas” | “xxxxxyyyyy” | 错误 |
“ascneencsa” | “艾欧阿艾欧” | 错误 |
“aaasssiiii” | “ggddddfffh” | 错误 |
例如,如果名为 s1 和 s2 的两个字符串包含以下字母:
s1 =“aba”
s2 =“xyz”
然后调用 detector_pattern(s1, s2) 应返回 False。
注意: 函数 detector_pattern 有两个参数:要比较的两个字符串。 你可以创建新的字符串,但除此之外你不能构建额外的数据结构来解决这个问题(没有列表、集合、字典等)。 请记住,无论两个字符串传递的顺序如何,该方法都应返回相同的值。
祝你好运!
我的代码:
import unittest
import re # only needed if we use hint from 6th line
''' HINT:
if we add this to the end of 13th line before ending ":":
and pattern.match(s1.replace(" ", "")) == pattern.match(s2.replace(" ", "")) and len(set(s1.replace(" ", ""))) == len(set(s2.replace(" ", "")))
it will solve more case's but we can't use set() method.
'''
pattern = re.compile("^([a-z][0-9]+)+$") # only needed if we use hint from 6th line
def detect_pattern(s1, s2):
if len(s1.replace(" ", "")) == len(s2.replace(" ", "")):
return True
else:
return False
class TestDetectPattern(unittest.TestCase):
def test_basics(self):
self.assertEqual(detect_pattern("", ""), True)
self.assertEqual(detect_pattern("a", "a"), True)
self.assertEqual(detect_pattern("x", "y"), True)
self.assertEqual(detect_pattern("ab", "xy"), True)
# self.assertEqual(detect_pattern("aba", "xyz"), False) # can be solved with hint from 6th line but in this task we can't use set() method
# self.assertEqual(detect_pattern("- - -", "xyz"), False) # can be solved with hint from 6th line but in this task we can't use set() method
self.assertEqual(detect_pattern("- - -", "aaa"), True)
self.assertEqual(detect_pattern("xyzxyz", "toetoe"), True)
# self.assertEqual(detect_pattern("xyzxyz", "toetoa"), False) # can be solved with hint from 6th line but in this task we can't use set() method
self.assertEqual(detect_pattern("aaabbbcccd", "eeefffgggz"), True)
self.assertEqual(detect_pattern("cbacbacba", "xyzxyzxyz"), True)
self.assertEqual(detect_pattern("abcdefghijk", "lmnopqrstuv"), True)
# self.assertEqual(detect_pattern("asasasasas", "xxxxxyyyyy"), False)
# self.assertEqual(detect_pattern("ascneencsa", "aeiouaeiou"), False)
# self.assertEqual(detect_pattern("aaasssiiii", "gggdddfffh"), False) # can be solved with hint from 6th line but in this task we can't use set() method
if __name__ == '__main__':
unittest.main()
有谁知道如何检查第二个字符串中相应位置的字符是否在第一个字符串中的相同位置重复? - 我认为这可以在不使用 set() 方法的情况下解决整个问题。
编辑:if语句的条件存在一些问题,但这个问题现在应该得到解决。
这个方法应该有效。我对循环内的变量命名不太满意,因此请随意更改它们。我尝试了您提供的所有示例,因此从语义上来说它应该是正确的。
def detect_pattern(s1: str, s2: str) -> bool:
if len(s1) != len(s2):
return False
for idx, (let_1, let_2) in enumerate(zip(s1, s2)):
for let_1_inner, let_2_inner in zip(s1[idx:], s2[idx:]):
if (let_1_inner == let_1) != (let_2_inner == let_2):
return False
return True
目前我正在 eduative.io 上学习这门课程。起初,当我读到这个问题时,我不明白如何准确地执行这个程序。
在@benjamin 的上述解决方案中,他使用了 zip() 和 enumerate () 等函数。这两个函数和数据结构在本课程中尚未教授。所以不建议采用上述解决方案。
我写了一个没有这两个函数的程序,结果成功了。
def detect_pattern(s1, s2):
if len(s1) != len(s2):
return False
for i in range (len (s1)):
let_1 = s1 [i]
let_2 = s2 [i]
for j in range ( i, len (s1)):
let_1_inner = s1 [j]
let_2_inner = s2 [j]
if (let_1_inner == let_1) != (let_2_inner == let_2):
return False
return True
嘿,这是一个非常简单的函数,可用于模式匹配:
def check_string(str1,str2):
if(len(str1)!=len(str2)):
return False
else:
for i in range(len(str1)):
for I in range(i+1,len(str1)):
if str1[I] == str1[i]:
indx1=I
for J in range(i+1,len(str2)):
if str2[J] == str2[i]:
indx2=J
if(indx1!=indx2):
return False
return True
str1 = "catcatcatdogcat"
str2 = "tietietiefrrtie"
result = check_string(str1, str2)
print(result)
说明1:两个字符串的长度必须相同
解释 2:我们可以迭代任一字符串的长度,因为它是相同的
解释 3:我们现在必须检查字符串 1 中第一个字母之后的后续字母,这就是范围从 i+1 开始的原因
解释 4:我们现在检查该字母是否出现在字符串中的其他位置,如果是,我们将此索引存储在 indx1 中
解释 5:我们对第二个字符串也做同样的事情
解释 6:我们现在检查两个字符串的索引是否相同,这是为了检查字母出现的位置是否相同,如果为 false,则返回 False
解释7:遍历完整个字符串后最后返回True,避免第一次返回True
这段代码是用Python编写的。我希望这有帮助:)
请注意,根据教育课程认证考试中的问题要求,我仅使用字符串来解决此问题。