【问题标题】:Function Returning 1, But Output is Zero?函数返回 1,但输出为零?
【发布时间】:2018-01-20 16:18:04
【问题描述】:

我有一个不寻常的情况,该函数返回零,但是当我在调试器中运行它时,上面的函数返回 1:

def solution(A):
    n = range(1, len(A)+1)

    if(len(A)!=len(n)):
        return 0

    s = sorted(A)

    if(s==n):
        return 1
    else:
        return 0

y = solution([4, 1, 3, 2])

print(y)

这是 Python 中的一些常见行为吗?

【问题讨论】:

  • " 该函数返回零,但是当我打印输出时,它在我的系统上打印零" 是的,有什么问题?
  • @Jean-FrançoisFabre 我在调试器中运行它,上面的函数返回 1...这就是我问的原因
  • 可能是因为当您调试它时,您使用的是 python 2,其中 rangelist
  • @mourinho:你在调试器中运行了这个,你得到了1,但没有调试器你得到了0,你的问题中没有。
  • @mourinho:您可能想要添加运行调试器的方式,因为您需要修复它,这样您以后就不会遇到此类问题。遇到意外行为时,您确实需要准确了解您的 Python 版本。

标签: python algorithm list sorting data-structures


【解决方案1】:

这样的代码可以在 python 2 中运行,但是 python 3 range 不会返回 list 但它被保存为len 工作的范围对象(并尽力模拟实际的 @987654324 @)。但是在python 3中:

>>> range(1,4)
range(1, 4)
>>> list(range(1,4))
[1, 2, 3]
>>> [1,2,3] == range(1,4)
False
>>> list(range(1,4)) == [1,2,3]
True

listrange 类型不同,根据文档

不同类型的对象,除了不同的数字类型,永远不会比较相等。

要获得平等,您需要将n 显式转换为列表

n = list(range(1, len(A)+1))

更简洁的工作方法:

def solution(A):
    return int(sorted(A) == list(range(1,len(A)+1)))

恕我直言,除非您明确想要返回 01 而不是自然的 FalseTrue,否则不需要保持 int 转换

为什么您得到 1 或 0 取决于您的调试与否,这可能是因为您使用了 2 种不同的 python 安装,一种用于调试,一种用于运行。如果你已经在使用 python 3,我建议你摆脱 python 2 的安装。

【讨论】:

  • sorted 的输入列表,但在任何时候 n 都不会通过 sort 所以 n 仍然是 range 对象。
  • 啊,是的,我现在明白了。
  • 也就是说,“不同类型的对象,除了不同的数值类型,永远不会比较相等。”事情有点令人反感。 range 模拟真实列表的效果非常好,很难区分。
  • 元组和列表也不相等。字符串、列表和元组也不行。它们都是序列,就像range() 是一个序列一样,所以我不明白为什么range() 会在这里例外。
  • @MartijnPieters 是的,我不是说应该。只是解释为什么 OP 被抓住了。
猜你喜欢
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多