我有一堆列表,例如[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操作。
如何在不显式遍历每个列表的情况下执行此操作?
答案 0 :(得分:0)
假设a
和b
的大小相同,则可以通过简单的列表索引使用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]
或者您可以将zip
与xor
一起使用:
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]]
但是我不知道这是否会真正提高性能,需要进行检查;肯定会需要更多的内存。