XOR非常大的旋转列表

时间:2016-10-15 20:48:24

标签: python xor

在列表上进行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)

3 个答案:

答案 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