Python 3:循环并比较整数列表的有效方法?

时间:2018-04-07 04:29:11

标签: python integer compare itertools

我试图比较两个包含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]

例如(i'每个列表使用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。

1 个答案:

答案 0 :(得分:0)

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

如果数据集具有某些属性,也许您可​​以获得一些优势。例如,如果您知道绝大多数可能的100M +对将在您的输出中,我将专注于找到少数被拒绝的对。如果值V出现在子列表中的位置P上,则可以对数据进行分类,使得每个子列表属于大约2K种可能性的20个类别(P,V)(20个位置* 99个值)。两个子列表比较False它们共享一个类别。这样,您可以在几个步骤中构建一组var tmp = fStream.ReadByte(); if (tmp == -1) // end of file reading else byteBuffer[index] = Convert.ToByte(tmp); 对,以便(i,j)将False与list1[i]进行比较。输出是来自可能的指数i,j的贝塞斯特乘积的其他所有东西。

顺便说一下,你可以比现在更有效率地进行比较。

一对匹配list2[j]就足以知道结果为a[z] == b[z]

False

或同等的:

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

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