【问题标题】:How to compare two lists and return the number of times they match at each index in python?如何比较两个列表并返回它们在python中每个索引处匹配的次数?
【发布时间】:2017-04-10 16:03:07
【问题描述】:

我有两个包含 1 和 0 的列表,例如

list1 = [1,1,0,1,0,1]
list2 = [0,1,0,1,1,0]

我想找到它们在每个索引处匹配的次数。所以在这种情况下,输出将是 3,因为它们仅在索引 1,2 和 3 处具有相同的值。

目前我正在这样做:

matches_list = []
for i in list1:
   index = list[1].index(i)
   if list1[index] == list2[index]:
            mathes_list.append(i)
   else:
       pass
return len(matches_list)

但是这很慢,我想多次这样做以比较大量这些列表

我希望有人可以建议我更快地做到这一点。有没有办法使用 set() 函数或类似的东西,例如比较两个列表但保持每个列表的顺序?

【问题讨论】:

  • 第一个循环可以使用enumerate。这样你就不必再次获取索引了。

标签: python list


【解决方案1】:

zip 列表,比较元素,计算总和。

>>> list1 = [1,1,0,1,0,1]
>>> list2 = [0,1,0,1,1,0]
>>> sum(a == b for a,b in zip(list1, list2))
3

(考虑在 Python 2 中使用 itertools.izip 以提高内存效率。)

【讨论】:

  • 谢谢,如果列表长度不同,这仍然有效吗?即它会只算到两个列表中最短的那个的末尾吗?
  • @BenJeffrey zipitertools.izip 将截断两个列表中较长的一个。如果要考虑不同长度的列表,请使用itertools.izip_longest
【解决方案2】:

这是闪电般的快速numpy 答案:

import numpy as np
list1 = np.array([1,1,0,1,0,1])
list2 = np.array([0,1,0,1,1,0])

len(np.where(list1==list2)[0])

numpy np.where 函数将返回符合函数的列表对中所有点的索引(在这种情况下,list1==list2 在索引 [1,2,3] 处)以及数据类型描述.在上面的例子中,我去掉了索引数组并计算了len() 的数量。

【讨论】:

  • 在小列表上使用 numpy 并不完全是“闪电般的速度”。转换为 numpy 数组和函数调用开销使这种方法(使用 OP 中的列表)比任何纯 python 方法慢 3-5 倍。它会更好地扩展,但 numpy 通常只有在输入已经是一个数组并且这些数组包含数百个项目时才会更快。
  • 公平点 - 我假设 OP 打算扩大到更长和更大的数字列表。虽然有趣的是,他们提到在大量列表中运行它,这可能需要再次采用稍微不同的方法。
  • 为什么不np.sum(list1 == list2)
【解决方案3】:

您可以将mapoperator.eqsum 一起使用:

>>> import operator
>>> sum(map(operator.eq, list1, list2))

这是有效的,因为 True 在求和时被解释为 1,而 False0 类似。


您也可以为此使用numpy

>>> import numpy as np
>>> np.count_nonzero(np.asarray(list1) == np.asarray(list2))

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 2016-12-23
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多