此问题集的Q1如下:
编写一个Python过程fix_machine来接受2个字符串输入,并返回第二个输入字符串作为输出,如果在第一个输入字符串中可以找到它的所有字符,并且“下次给我一些没有用的东西”。如果不可能的话。在第一个输入字符串中存在的字母可以根据需要多次使用以创建第二个字符串(您不需要跟踪重复使用)。
例如:
print fix_machine('UdaciousUdacitee', 'Udacity')应该输出“下次给我一些没有用的东西”。
以及:
print fix_machine('buy me dat Unicorn', 'Udacity')应该输出“Udacity”
这是我自己想出的解决办法:
def fix_machine(debris, product):
i = -1
while True:
i = i +1
if debris.find(product[i]) == -1:
return "Give me something that's not useless next time."
break
word = product[0:i+1]
if word == product:
break
return word我在网上找到了另一个示例解决方案:
def fix_machine(debris, product):
x = 0
while x < len(product):
if debris.find(product[x]) == -1:
return "Give me something that's not useless next time."
x += 1
return product我的代码执行正确,但我想知道我使用break函数的方式是否合理。对于如何更好地理解them循环并优化它们,有什么建议吗?
发布于 2021-12-07 22:40:38
两者在所做的工作上大致相等。您一直在循环直到中断,而第二个解决方案总是循环到它知道的所需的最大循环数(除非找到失败的情况)-- product参数的长度。这两者将在相同的O(n)时间内运行,因此,虽然您的代码有些笨拙,但实际上并没有什么不同。
还有其他方法可以更清楚地理解这一点。例如,由于您不关心重复变量,将product作为集合的输入可能更容易:
required_characters = {c for c in product} # puts all characters into a set, dropping repeats (because sets can only have a given value once)
for c in required_characters:
if c not in debris:
return "Give me something that's not useless next time."
return product这里的功能区别在于,您只循环了一次product,并且可以在找到所有字符时停止遍历debris。但这也在O(n)中运行--这是您实际能够做到的最快的速度。真正的问题是,什么是你最清楚的,程序员,谁读你的代码最清楚。
在评论中,@alani指出,您也可以这样做:
if set(product) <= set(debris):
return product
return "Give me..."这做了一些类似的事情,使用set比较。这里的一个轻微的缺点是,您将两个输入都放入集合(一个O(n)操作),这意味着保证了您的最大运行时--如果它知道这是一个不能满足的条件,就不会提前退出。然而,它甚至更简洁,因此更清楚。对于合理的输入,一个完全有效的方法。
发布于 2021-12-07 22:46:30
while循环可以用于任何类型的循环,但是对于在集合中迭代(如单词中的字母)的情况,for循环更合适。通常,当您事先不知道循环将执行多少次时,while循环更有用。
下面是一个遍历两个单词的示例,以查找product中没有出现在debris中的字母
NOT_FOUND_MSG = "Give me something that's not useless next time."
def fix_machine(debris, product):
for p_char in product:
found = False
for d_char in debris:
if p_char == d_char:
found = True
break
if not found:
return NOT_FOUND_MSG
return product我们可以通过使用in来检查p_char是否在debris中,而不必显式地迭代它,从而澄清(甚至优化):
def fix_machine(debris, product):
for p_char in product:
if p_char not in debris:
return NOT_FOUND_MSG
return product让我们通过使用for循环的另一种形式来进一步减少它:
def fix_machine(debris, product):
if any(p_char not in debris for p_char in product):
return NOT_FOUND_MSG
return product最后,利用set的属性,完全消除了显式循环。
def fix_machine(debris, product):
return product if set(product).issubset(debris) else NOT_FOUND_MSG发布于 2021-12-07 22:46:19
我将在假设这是while循环练习的一部分的情况下回答这个问题。
您的解决方案是一个很好的尝试,但有一些事情您仍然可以改进。我将遍历你的代码并指出它们。
def fix_machine(debris, product):
i = -1 # THING 1
while True:
i = i +1 # ALSO THING 1
if debris.find(product[i]) == -1:
return "Give me something that's not useless next time."
break # THING 2
word = product[0:i+1] # THING 3
if word == product:
break
return word第一件事:像这样初始化索引变量可能有效,但它不是很干净。相反,您应该按照所提供的示例进行操作,并将其初始化为零,然后在循环结束时增加。这是更容易阅读和更好的实践整体。
事情的第二件事:这个断续声明永远不会到达。return语句将结束您的函数(扩展为循环)。
事情3:这是一个聪明的想法,但一个更好的想法是,一旦你重复了整个产品。这样,您就不必每次迭代都检查是否相等。
如果您修复了所有这些,您将注意到最后得到了第二个示例:
def fix_machine(debris, product):
x = 0 #THING 1 (Initialize to zero)
while x < len(product): #THING 3 (stop at end of product)
if debris.find(product[x]) == -1:
return "Give me something that's not useless next time." # THING 2 (no break)
x += 1 # THING 1(INCREMENT AT END)
return producthttps://stackoverflow.com/questions/70267695
复制相似问题