我想将1个列表的所有元素与另一个元素进行XOR。我该怎么做?

时间:2019-06-03 17:35:28

标签: python python-3.x list large-data xor

我有一堆列表,例如[0,0,1,0,1 ...],我想对2个列表进行XOR,然后将输出作为列表给出。 喜欢: [0,0,1] XOR [0,1,0]-> [0,1,1]

res = []
tmp = []

for i in Employee_Specific_Vocabulary_Dict['Binary Vector']:
    for j in Course_Specific_Vocabulary_Dict['Binary Vector']:

        tmp = [i[index] ^ j[index] for index in range(len(i))]
        res.append(temp)

我的每个列表/向量的大小约为3500个元素,因此我需要一些时间来节省时间,因为这段代码要花费20多分钟才能运行。

我有3085个列表,每个列表都需要与4089个其他列表进行XOR操作。

如何在不显式遍历每个列表的情况下执行此操作?

3 个答案:

答案 0 :(得分:0)

假设ab的大小相同,则可以通过简单的列表索引使用xor操作(即^):

a = [0, 0, 1]
b = [0, 1, 1]
c = [a[index] ^ b[index] for index in range(len(a))]
print(c) # [0, 1, 0]

或者您可以将zipxor一起使用:

a = [0, 0, 1]
b = [0, 1, 1]
c = [x ^ y for x, y in zip(a, b)]
print(c) # [0, 1, 0]

zip仅会进入最短列表(如果它们的大小不同)。如果它们的大小不同,并且您想转到更长的列表,则可以使用zip_longest

from itertools import zip_longest
a = [0, 0, 1, 1]
b = [0, 1, 1]
c = [x ^ y for x, y in zip_longest(a, b, fillvalue=0)]
print(c) # [0, 1, 0, 1]

答案 1 :(得分:0)

使用map

answer = list(map(operator.xor, lst1, lst2)).

zip

answer = [x ^ y for x,y in zip(lst1, lst2)]

如果您需要更快的速度,请考虑使用NumPy而不是Python列表来保存数据。

答案 2 :(得分:0)

使用numpy可以提高性能,所需的功能是cat,如下所示:

bitwise_xor

概念证明:

import numpy as np
results = []
for i in Employee_Specific_Vocabulary_Dict['Binary Vector']:
    for j in Course_Specific_Vocabulary_Dict['Binary Vector']:
        results.append(np.bitwise_xor(i, j))

输出:

a = [1,0,0,1,1]
b = [1,1,0,0,1]
x = np.bitwise_xor(a,b)
print("a\tb\tres")
for i in range(len(a)):
    print("{}\t{}\t{}".format(a[i], b[i], x[i]))

编辑

请注意,如果数组的大小相同,则只需执行一项操作,a b x 1 1 0 0 1 1 0 0 0 1 0 1 1 1 0 仍将起作用,所以:

bitwise_xor

仍然可以使用,并且您将拥有:

a = [[1,1,0], [0,0,1]]
b = [[0,1,0], [1,0,1]]
res = np.bitwise_xor(a, b)

在您的情况下,可能的解决方法是:

res: [[1, 0, 0], [1, 0, 0]]

但是我不知道这是否会真正提高性能,需要进行检查;肯定会需要更多的内存。