【问题标题】:Python 3: Efficient way to loop through and compare integer lists?Python 3:循环和比较整数列表的有效方法?
【发布时间】:2018-09-17 03:13:17
【问题描述】:

我正在尝试比较两个包含 10,000 多个列表整数的巨大列表。每个子列表包含 20 个整数,它们是 1 到 99 之间的随机数。在子列表中,所有整数都是唯一的。

list1 = [[1, 25, 23, 44, ...], [3, 85, 9, 24, 34, ...], ...]
list2 = [[3, 83, 45, 24, ...], [9, 82, 3, 47, 36, ...], ...]
result = compare_lists(list1, list2)

compare_lists() 函数将比较两个列表中相同位置的整数,如果整数不同则返回这两个列表。

循环遍历每个子列表显然非常低效,因为有超过 1 亿种可能的组合。 (list1 中的 10,000 多个子列表中的每一个都与 list2 中的 10,000 多个子列表进行比较)

import itertools
def compare_lists(list1, list2):
    for (a, b) in itertools.product(list1, list2):
        count = 0
        for z in range(20):
            if a[z] != b[z]:
                count += 1
        if count == 20:
            yield [a, b]

例如(我将在每个列表中使用 4 个整数):

a = [1, 2, 3, 4] # True
b = [5, 6, 7, 8] # (integers are different)

a = [1, 2, 3, 4] # True
b = [2, 3, 4, 1] # (same integers but not in same position, still true)

a = [1, 2, 3, 4] # False
b = [1, 6, 7, 8] # (position [0] is identical)

itertools.product 在这种情况下似乎效率很低。有没有更快或更有效的方法来做到这一点?

抱歉,如果不清楚,我最近才开始使用 Python。

【问题讨论】:

  • 正如您所说,您拥有子列表中的所有唯一元素,您可以尝试比较 set(a) == set(b) 它会比较有序的集合,如果两个语句匹配则返回 True
  • “两个列表在同一位置”是什么意思?在低效示例中,您正在检查不在同一位置的列表。
  • 你反对 NumPy 吗?如果我理解正确,这只是 (arr1 == arr2).any(1) 获得布尔掩码。
  • 让我澄清一下“两个相同位置的列表”,它应该更好地表述为“比较每个列表中相同位置的整数”,即list1[sub_list_random][z] == list2[sub_list_random_2][z]z 是“位置”,来自range(20) 循环。
  • 似乎很难。也许你可以在Computer Science 上提问(关于算法,而不是 Python)。

标签: python integer compare itertools


【解决方案1】:

我一般不知道如何根据一些预先计算的数据来减少列表-列表比较的次数。

如果数据集具有某些属性,也许您可​​以获得一些优势。例如,如果您知道绝大多数可能的 100M+ 对将在您的输出中,我将专注于查找被拒绝的少数对。如果值 V 出现在子列表中的位置 P 上,您可以对数据进行分类,使每个子列表属于来自大约 2K 种可能性(20 个位置 * 99 个值)的 20 个类别(P,V)。两个子列表比较 False,它们共享一个类别。这样,您可以通过几个步骤构建一组 (i,j) 对,以便 list1[i] 将 False 与 list2[j] 进行比较。输出是可能索引 i,j 的 carthesian 乘积。


顺便说一句,您可以使比较比现在更有效。

一对匹配的a[z] == b[z] 足以知道结果是False

    for z in range(20):
        if a[z] == b[z]:
            break
    else:
        yield [a, b]

或同等的:

    if all(i != j for i,j in zip(a,b)):
        yield [a, b]

我没有运行计时测试哪个更快。无论如何,加速可能是微不足道的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多