在列表上进行XOR的有效方式,
例如:
#here a,b,c,d are integers
L = [a,b,c,d]
N = [b,c,d,a] #right rotation of list L
Newlist = enter code here[a^b, b^c, c ^d ,d^a]
由于列表的大小非常大,有没有有效的方法可以解决。
到目前为止,这是我所做的。#right rotation of list
def shift(seq, n):
n = n % len(seq)
return seq[n:] + seq[:n]
L = [6,7,1,3]
N = shift(L,1)
new = []
for i,j in zip(L,N):
new.append(i^j)
print(new)
答案 0 :(得分:3)
您可以尝试检查一下:
from collections import deque
L = [6, 7, 1, 3]
L2 = deque(L)
L2.rotate(-1) # rotate to left
result = [i ^ j for i, j in zip(L, L2)]
这可能至少会稍快一些。
其他解决方案是检查这种可能性:
from itertools import islice
L = [6, 7, 1, 3]
# This will add all the XoRs except for the last pair (6, 3)
result = [i ^ j for i, j in zip(L, islice(L, 1, len(L))]
# adding the last XOR
result.append(L[0] ^ [L-1])
print(result)
[1, 6, 2, 5]
答案 1 :(得分:0)
这是另一种方法。我写的发电机可能会有所改进,但它会给你一个想法。这节省空间,因为您没有构建新列表:
>>> def rotation(lst,n):
... for i in range(len(lst)):
... yield lst[(i + n) % len(lst)]
...
>>> L = [1,2,3,4,5]
>>> list(rotation(L,1))
[2, 3, 4, 5, 1]
>>> [a ^ b for a,b in zip(L,rotation(L,1))]
[3, 1, 7, 1, 4]
定义rotation
的另一种方法是:
>>> def rotation(lst,n):
... yield from (lst[(i + n) % len(lst)] for i in range(len(lst)))
...
>>> L = ['a','b','c','d']
>>> ["{}^{}".format(i,j) for i,j in zip(L,rotation(L,1))]
['a^b', 'b^c', 'c^d', 'd^a']
答案 2 :(得分:0)
这是另一种方法!
我定义了一个函数,给定一个索引,返回该索引处的数字以及"右边的#34;作为一对(a, b)
,然后XOR那些。给它列表范围之外的索引也是安全的。所以:
def rotate_and_xor(l):
def get_pair_xor(i):
i %= len(l)
j = (i + 1) % len(l)
return l[i] ^ l[j]
return list(map(get_pair_xor, range(len(l))))
我不建议这必然是最好的解决方案;我只想以不同的方式解决它。使用像其他人建议的列表推导可能更像Pythonic,但我喜欢使用map
。