【问题标题】:Strange comparisons in Python [duplicate]Python中的奇怪比较[重复]
【发布时间】:2013-10-12 17:24:24
【问题描述】:

我在胡闹,偶然发现了一些我不明白的东西......

问题一:

a = [1,2,3]
b = [1,2,3,4]

len(a) < b

结果为True,但这实际上是在比较两个列表的长度吗?好像是因为这也是真的……

a = [15,32,7]
len(a) < b

问题 2:

当我们尝试将整数与列表进行比较时会发生什么?为什么这些都是真的(我假设有一个一般性的解释......)......

3 < b
20 < b
float('inf') < b
None < b
(lambda x: (x**x)**x) < b

...这些都是假的?

'poo' < b
'0' < b

【问题讨论】:

    标签: python comparison-operators


    【解决方案1】:

    在 Python 2.x 中,无法直接比较的不同类型的项目使用它们的类型名称进行比较。所以所有整数都小于所有列表,因为"int" 小于"list"。出于同样的原因,所有strs 都大于所有ints 和floats。

    在 Python 3 中删除了这种不直观的行为(我假设引入这种行为是为了使类似类型的项目在异构列表中一起排序),这会引发这些比较的异常。

    【讨论】:

    • 也申请(2, ,3, 4) &lt; [2, 3, 4] ? 我的意思是这是 = "tuple" &lt; "list" = False
    • 谢谢,这很有帮助。那么 len(list1)
    • len(list1) 是一个整数,而list2 是一个列表。正如我所说,整数总是小于列表。未比较列表的长度。
    • @GrijeshChauhan:在我添加“直接可比”之前,您可能已经抓住了我的答案。元组和列表可以相互比较,因为它们都是序列。
    • @kindall 是的,但我刚刚尝试过我的 Python3.3 (2, ,3, 4) &lt; [2, 3, 4] 给了我TypeError: Unoderable Types tuple() &lt; list()
    【解决方案2】:

    来自docs关于数据类型:

    序列对象可以与其他具有相同特征的对象进行比较 序列类型。比较使用字典顺序:首先 比较前两项,如果它们不同,则确定 比较结果;如果它们相等,则接下来的两项是 比较,依此类推,直到用完任一序列。

    请注意,比较不同类型的对象是合法的。结果 是确定性但任意的:类型按其名称排序。 因此,列表总是小于字符串,字符串总是 小于元组等。1 比较混合数字类型 根据它们的数值,所以 0 等于 0.0,等等。

    而且,值得注意的是,

    脚注 1 比较不同类型对象的规则 不应依赖;它们可能会在未来版本的 语言。

    【讨论】:

    • 谢谢,关于序列对象的部分很有帮助。
    【解决方案3】:

    其他答案很好地解释了正在发生的事情,但比较长度的正确方法是

    len(a) < len(b)
    

    【讨论】:

    • 我认为 OP 在比较长度时没有问题。他想解释为什么他会看到他目睹的行为。这个答案虽然正确,但并不是真正针对 OP 的需求。
    • 这和我想的差不多,除了这一行“但这实际上是在比较两个列表的长度”。所以我想我会把它扔在那里以防万一。
    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2011-10-07
    相关资源
    最近更新 更多