【问题标题】:Comparing two lists using the greater than or less than operator使用大于或小于运算符比较两个列表
【发布时间】:2012-10-14 16:59:39
【问题描述】:

我注意到最近有一段代码直接比较了两个整数列表,如下所示:

a = [10,3,5, ...]
b = [5,4,3, ...,]
if a > b:
     ...

这似乎有点奇怪,但我想如果list_a 的所有元素都大于list_b 的元素,它会返回True,如果每个元素相等或list_b 的元素都大于则返回False比list_a 大。所以我测试了它:

>>> a=[3,3,3,3]
>>> b=[4,4,4,4]
>>> a>b
False
>>> b>a
True

好的,这行得通。就像这样:

>>> b = [1,1,1,1]
>>> a = [1,1,1,1]
>>> a>b
False
>>> b>a
False

但是当它变得更加模糊时:

>>> a=[1,1,3,1]
>>> b=[1,3,1,1]
>>> a>b
False
>>> b>a
True

或:

>>> a=[1,3,1,1]
>>> b=[1,1,3,3]
>>> a>b
True
>>> b>a
False

结果有点奇怪。 python实际上在做什么?似乎它返回的结果有利于第一个列表,其中最左边的元素大于对应的?

【问题讨论】:

    标签: python list


    【解决方案1】:

    来自 Python 教程中的Comparing Sequences and Other Types

    比较使用字典顺序:首先比较前两项,如果它们不同,则确定比较的结果;如果它们相等,则比较接下来的两项,依此类推,直到任一序列用完。

    另请参阅有关 lexicographical order 的 Wikipedia 文章。

    【讨论】:

      【解决方案2】:

      由于我一开始并没有发现使用“字典顺序”进行列表/元组比较的解释特别有启发性,所以这里尝试“用我自己的话”来解释它。首先,这里有一些示例列表,在下面的解释中提到:

      a = [1, 2, 3]
      b = [1, 2, 10]
      c = [1, 2, 3, 100]
      d = [1, 2, 3]
      e = [1, 2, 3, 4, 'a']
      f = ['a', 'b', 'c']
      

      依次比较每个索引处的一对项目。因此,将ab 进行比较将导致11 进行比较,22 进行比较,310 进行比较。

      当发现或者不相等的一对项目或者--如果列表的长度不同--较短列表的末尾是到达。

      例如,比较ab 时,比较310 时将停止。比较bc 时,比较103 时将停止。

      一旦找到不相等的对,整体结果就是比较不相等的项目的结果。这适用于列表是否相同长度 - 例如,列表b 大于列表c,因为c 中的100 永远不会发挥作用。

      例如,当比较ab 时,整体结果将是比较310 的结果。 a < b -> True 因为3 小于10a > b -> False 因为3 不大于10a == b -> False 因为3 不等于10

      如果其中一个列表较短且其 N 项等于较长列表的前 N ​​项,如 ac,则较短的列表将被视为少于较长的列表(所以 @ 987654357@小于c)。

      只有当两个列表长度相同并且所有成对的项目比较相等时,两个列表才会比较为相等。

      关于类型的注意事项:如果一对中的项目不可比较,则比较将像往常一样以TypeError 失败。例如,将1'a' 进行比较时,将列表af 进行比较将失败。但还要注意,列表 de 可以进行比较,因为 e 中的 'a' 永远不会与 d 中的任何内容进行比较。

      【讨论】:

      • “当发现不相等的项目对或 - 如果列表长度不同 - 到达较短列表的末尾时,对的比较将停止。”如果这是真的,为什么 a= [1,2,3] b = [1,2,3,4] a
      • 这种情况经常发生堆栈溢出,一个好问题和两个答案,一个非常复杂,只有知道答案的人才能理解它,而一个过于复杂的答案被卖为“简单”的答案。专业提示查看 ge 定义下的列表对象的源代码。如果项目相同,则具有更大项目的列表总是更大,然后长度优先,如果列表相同但顺序不同,则具有第一个更大项目的列表更大。
      【解决方案3】:

      给定的答案不考虑较大列表中的重复项,您可以遍历较大的列表并每次将其切片以将其与子列表进行比较,这将保持顺序并考虑重复项。

      这段代码可以工作:

      def check_sublist(List,Sublist)
          for i in range(len(List)):
              if List[i:] ==Sublist:
                  return True
          return False
      

      是的,这不是时间效率,但这是我能想到的唯一解决方案,因为使用 set() 不会保持顺序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 2012-11-29
        • 1970-01-01
        相关资源
        最近更新 更多