【发布时间】: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