【问题标题】:How to compare two lists in python如何在python中比较两个列表
【发布时间】:2015-04-30 07:36:22
【问题描述】:

假设我有两个列表(或numpy.arrays):

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

如何检查a 的每个元素是否小于b 在同一索引处的对应元素? (我假设索引从 0 开始) 即

at index 0 value of a = 1 < value of b = 4
at index 1 value of a = 2 < value of b = 5
at index 2 value of a = 3 < value of b = 6

如果a 等于[1,2,7],那么这是不正确的,因为在索引2 处a 的值大于b 的值。此外,如果a 的长度小于b 的长度,它应该只比较a 的索引和b 的索引。

例如这对ab

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

在索引 0 和 1 处,a 的值小于b,因此这也将通过检查。

P.S.--> 我必须在 if 语句中使用上述条件。 而且,a 的任何元素都不应等于 b 的元素,即严格小于。随意使用尽可能多的工具。 (虽然我这里用的是列表,你也可以把上面的列表转换成numpy数组。)

【问题讨论】:

    标签: python list python-3.x numpy itertools


    【解决方案1】:

    zipall 回答这两个部分

    all(i < j for (i, j) in zip(a, b))
    

    zip 会将a 开头的值与b 开头的值配对;当较短的可迭代对象用完时,迭代结束。 all 返回 True 当且仅当给定的所有项目在布尔上下文中为真。此外,当任何项目失败时,False 将提前返回。

    示例结果:

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> all(i < j for (i, j) in zip(a, b))
    True
    >>> a = [1,2,7]
    >>> b = [4,5,6]
    >>> all(i < j for (i, j) in zip(a, b))
    False
    >>> a = [1,2]
    >>> b = [4,5,-10]
    >>> all(i < j for (i, j) in zip(a, b))
    True
    

    IPython 3.4.2 的时间安排:

    In [1]: a = [1] * 10000
    In [2]: b = [1] * 10000
    In [3]: %timeit all(i < j for (i, j) in zip(a, b))
    1000 loops, best of 3: 995 µs per loop
    In [4]: %timeit all(starmap(lt, zip(a, b)))
    1000 loops, best of 3: 487 µs per loop
    

    所以在这种情况下星图更快。一般来说,Python 中有两件事相对较慢:函数调用和全局名称查找。 Retard's solutionstarmap 似乎在这里获胜,因为从 zip 产生的元组可以按原样作为 *args 提供给 lt 内置函数,而我的代码需要解构它。

    【讨论】:

      【解决方案2】:

      只是一种替代方式,不确定它与其他答案的表现如何:

      a = [1,2,3]
      b = [4,5,6]
      if filter(lambda x: x[0] < x[1], zip(a,b)):
          return True
      

      我在 if 语句中使用它,因为问题表明它将像那样使用它,并且不需要在那里进行布尔转换。否则我会将 filter() 包裹在 bool() 中。 同样,这只是为了演示一种替代方法,并不意味着要成为最有效的方法。

      【讨论】:

        【解决方案3】:

        作为一种变体,快速而简短

        from operator import lt
        from itertools import starmap, izip
        all(starmap(lt, izip(a, b)))
        

        【讨论】:

        • @Antti Haapala,对于 a 和 b,其中 a = list(range(10000)) 和 b = list(range(1, 10001)) 在我的系统上,您的解决方案提供 809 微秒,而我的是 558
        • 确实你的速度更快 :D 因为创建的元组更少。
        • 你有什么理由不使用itertools.izip
        • 在我的系统上 izip 快得多
        • 嘿,我们说的是 Python 3。zip itertools.izip 来自 Python 2。
        【解决方案4】:

        由于这个问题有一个numpy 标签,我想我会提供一个numpy 解决方案。

        您只能在长度相等的arrays 上使用&lt; 运算符,因此如果您的arrays 长度不同,则需要缩短最长的那个。

        In [26]: import numpy as np
        
        In [27]: a = [1,2,3]
        
        In [28]: b = [4,5,6]
        
        In [29]: np.all(a < b)
        Out[29]: True
        
        In [30]: a = [1,2]
        
        In [31]: b = [3,4,5]
        
        In [32]: shortest = min(len(a), len(b))
        
        In [33]: np.all(a[:shortest] < b[:shortest])
        Out[33]: True
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-10
          • 2018-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多