【问题标题】:Why does this code not work for all inputs为什么此代码不适用于所有输入
【发布时间】:2016-08-18 06:18:44
【问题描述】:

我正在尝试编写将两个字符串作为输入的 python 代码,并检查第二个字符串的所有字符是否都存在于第一个字符串中。如果是这样,那么输出是第二个字符串。如果不是,则输出为字符串“This doesn't work”。我已经针对各种输入测试了此过程,它通常有效,但并非总是如此。例如,如果我的两个输入分别是“helo”和“olhe”,则输出是“This doesn't work”,而它应该是“olhe”,因为“olhe”中的所有字符都出现在“helo”中。

这是我的代码

def fix_machine(debris,product):
    n = 1
    while True:
          first_element = product[0:n]
          find_first_element = debris.find(first_element)
          if first_element == product:
               return product
               break
          n = n + 1
          if find_first_element == -1:
               return "This does not work"
               break

那么为什么这不起作用呢?

【问题讨论】:

  • 在调试器中单步调试并找出答案。
  • 您的缩进包含制表符和空格的组合。这在 Python 中是一个非常糟糕的主意。将您的文本编辑器配置为仅使用空格并更正您的代码。
  • product[0:n] 依次生成更大的product;它不会产生单个字符。
  • 附注:您描述了一个通用函数,然后使用一个非常具体的函数(至少按名称)显示您的代码,称为fix_machine。我们是否应该得出结论debrisproduct 是两个输入字符串?因为product[0:n] 肯定对这个结论没有帮助(我希望first_element 是单个字符)。您应该显示一段与您的描述一致的代码,例如,def check_chars(str1,str2)。其次,整个函数看起来像一个非常糟糕的方法来做你描述的事情,可以在一行中实现。
  • 第三,如前所述,一步一步调试你的代码。这就是编程背后的全部想法(与“为什么这不起作用?”相反)。

标签: python


【解决方案1】:

假设您严格希望所有第二个字符串字符首先出现,您可以将其作为一个更优雅的解决方案。

def fix_machine(first, second):
    for character in second:
        if character not in first:
            return False
    return second

这将为您的代码返回正确的输入。不完全确定您的代码有什么问题,因为我没有逐步完成。

编辑:Albert 有一个更优雅的解决方案,参考他的

【讨论】:

    【解决方案2】:

    据我了解,您只想比较两个包含不同字符的字符串。

    为此,我建议将两个字符串都转换为 set,然后提供(与 list 相比)对其元素的无序比较。

    def check_string(first_str, second_str):
        # convert strings to sets in order to compare characters
        if set(first_string) == set(second_string):
            return second_str
        else:
            return 'This does not work.'
    
    
    first_string = 'helo'
    second_string = 'olhe'    
    print(check_string(first_string, second_string))
    # prints True
    
    first_string = 'helo'
    second_string = 'hello'    
    print(check_string(first_string, second_string))
    # prints True
    
    first_string = 'helo'
    second_string = 'helofoo'    
    print(check_string(first_string, second_string))
    # prints 'This does not work.'
    

    【讨论】:

      【解决方案3】:

      我同意您应该使用调试器单步执行该代码(如果您还没有设置 IDE,可以尝试 PyCharm)以查看问题所在。很难解释出了什么问题,但我认为这与first_element = product[0:n] 有关。这将返回越来越大的字符串段。即第二次运行时的“ol”。

      这是另一种写法

      def fix_machine(debris, product):
          all_present = all(letter in debris for letter in product)
          return product if all_present else 'This does not work'
      

      【讨论】:

      • 您在该语句的开头缺少return
      • @barakmanos 我只是做了足够的工作让它在 python repl 中进行测试。我将对其进行更新以模仿 OPs 功能。
      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2021-09-17
      • 2019-08-28
      • 1970-01-01
      相关资源
      最近更新 更多