【问题标题】:Python: pairwise comparison between two lists: list a >= list b?Python:两个列表之间的成对比较:列表 a >= 列表 b?
【发布时间】:2015-01-23 23:44:05
【问题描述】:

如果我想检查列表中的所有元素

a: [1 2 3 6]

大于或等于它们在另一个列表中的对应元素

b: [0 2 3 5]

如果所有 i 的 a[i]>b[i],则返回 true,否则返回 false。 这有逻辑功能吗?比如 a>b?谢谢

【问题讨论】:

  • 你的意思是成对的吗?即 a1 > b1, a2>b2 或 a1>all b's
  • 是的,亚当。对不起,我的意思是成对的。

标签: python list comparison


【解决方案1】:

你可以这样做

all(x >= y for x,y in zip(a,b))

它具有短路评估的优点:如果它找到任何x < y,它会立即返回False

【讨论】:

  • 要投票给这个,因为它不假定任何关于 numpy 的内容并且不需要导入。
【解决方案2】:

如果你真的想比较ab 中的每个元素,你实际上只需要检查bmax,所以如果我们找到任何元素,这将是一个0(n) 解决方案短路小于 b 的最大值:

mx = max(b)
print(all(x >= mx for x in a))

对于成对你可以使用枚举:

print(all(x >= b[ind] for ind,x in enumerate(a)))

或者使用hughbothwell的zip思路使用itertools.zip:

from itertools import izip
print(all(x >= y for x,y  in izip(a,b)))

或numpy:

print(np.greater_equal(a,b).all())

print(np.all(a >= b))

【讨论】:

  • @C.Zeng,别担心,你用的是numpy还是普通的python列表?
  • 非常感谢。我目前只使用普通列表,我愿意切换到 numpy。我听说 numpy 在很多情况下都更快,对吧?
  • @C.Zeng,不客气。是的,对于大数据,numpy 会非常有效。
【解决方案3】:

您可以编写一个显式的 for 循环,或者您可以使用解释器执行如下所示的内联双循环和 all。

>>> a = {1,2,3,4}
>>> b = {2,3,4,5}
>>> lst = [x>y for x in a for y in b]
>>> lst
[False, False, False, False, False, False, False, False, True, False, False, False, True, True, False,False]
>>> all(bool==True for bool in lst)
False

【讨论】:

  • all(x>y for x in a for y in b) 会做同样的事情
【解决方案4】:

如果你愿意使用numpy,你可以用一个逻辑函数来做到这一点(它比纯python列表比较快得多)

>>> from numpy import array
>>> a=array([1,2,3,4,5])
>>> b=array([3,0,3,1,2])
>>> a > b
array([False,  True, False,  True,  True], dtype=bool)
>>> 

【讨论】:

  • 我认为你不应该假设使用 numpy.请看下面我的想法。
  • 我之所以提出这个答案,是因为 OP 询问了有关使用“>”运算符的问题。我赞成另一个答案。
【解决方案5】:

这个怎么样?我会赢得代码高尔夫吗?

a=[1,3,8,6]
b=[0,2,3,5]

print all(map(cmp,a,b))

【讨论】:

  • @PadraicCunningham 怎么会这样..?
  • 试试all(map(cmp, [1],[1])),正确答案是True
  • 真的吗?我认为 OP 澄清了:如果 a 中的每个元素都大于 b 中的每个元素,则返回 True,否则返回 false。
  • 大于或等于另一个列表中的元素,因此绿色勾号。不错的复活 cmp 虽然不记得我上次看到它使用的是什么时候 ;)
  • @PadraicCunningham 哈哈。嗯......看来OP自相矛盾。他一开始是这么说的,但他的第二句话有别的意思。然后他用such as a>b?来描述他的意图。哦,好吧.. :)
【解决方案6】:
a = [1, 2, 3, 6]
b = [0, 2, 3, 5]

def check_lists(a, b):
    result = []

    for i in range(len(a)):
        result.append(a[i] >= b[i])

    return result

print check_lists(a, b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多