【问题标题】:Nesting Structure Comparisons嵌套结构比较
【发布时间】:2019-12-14 17:15:27
【问题描述】:

我正在尝试使用递归编写嵌套结构比较。看起来很基本但不起作用:当我比较 len(original)len(other) 它们是不同的,但它不是 return False。为什么?

def same_structure_as(original,other):
    if type(original) != type(other) or len(original) != len(other):
        return False
    for i in range(len(original)):
        if type(original[i]) != type(other[i]):
            return False
        if type(original[i]) is list and type(other[i]) is list:
            same_structure_as(original[i],other[i])
    return True

print (same_structure_as([1,[1,1]], [2,[2]]))

【问题讨论】:

  • 除了缩进之外,您对 same_structure_as 的递归调用存在问题:缺少返回,因此与子结果无关,返回 True。
  • 谢谢,现在应该看起来更好了...您能否详细说明丢失的退货?
  • 重新阅读问题。在您的第二个循环期间,由于 [1,1] 和 [2] 都是类型:列表,它们将返回“true”。您需要修复 for 循环。
  • 它们有不同的长度......我检查了类型和长度。
  • 是的,但即使它在第二个循环中返回“False”,它也会返回到第一个循环的 for 循环,然后返回“True”。为了帮助您调试,请将return Falsereturn True 替换为return print("False")return print("True")

标签: python recursion nested comparison


【解决方案1】:

正如评论,您的代码没有考虑递归结果。我更正了它并使用了组合循环而不是重复繁琐的索引。 (我仍然不喜欢多重返回结构)。请注意,您不会在循环中比较简单的值,因此仍然需要用于列表类型比较的 else 部分。否则,这将按预期工作:

   def same_structure_as(original, other):
       if type(original) != type(other) or len(original) != len(other):
           return False
       for org_val, other_val in zip(original, other):
           if type(org_val) != type(other_val):
               return False
           if type(org_val) is list and type(other_val) is list:
               if not same_structure_as(org_val, other_val):
                   return False
       return True

   print (same_structure_as([1,[1,1]], [2,[2]]))

【讨论】:

    【解决方案2】:

    暂无我的原始答案,但这与您的嵌套数组长度更相关。

    len([1,[1,1]]) 的长度为 2。它不会计算内部嵌套项。因此,将此嵌套列表与其他列表进行比较将通过您的 if 检查。

    【讨论】:

    • 我试过了。它比 len(original) != len(other) 返回 True。
    • [1,[1,1]] 的长度为 2,[2,[2]] 的长度也为 2。在两个列表上做长度将是相同的,因为它计算嵌套数组的外部列表项。
    • 第一次递归后,它比较 [1,1] 和 [2](数组的第二个元素)....长度不同,它应该返回 False。
    猜你喜欢
    • 2015-09-03
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多