如何在不同长度的列表之间应用类似按位的XOR?

时间:2018-05-07 15:15:00

标签: python

我想要做的是初始化一个有5个元素设置为0的数组,然后将另一个数组复制到第一个数组,如下所示:

a = [0, 0, 0, 0, 0]
b = [1, 2, 3]
print a | b
[1, 2, 3, 0, 0]

除此之外是否有任何pythonic方式:

for i, x in enumerate(b):
    a[i] = x

修改

我忘了提到缓冲区a将始终在开头填充普通零,条件len(b) < len(a)始终为true,在每种情况下缓冲区a都会总是从索引0开始被覆盖。

我首先解释为什么我需要这种行为,基本上我有一个原始的256字节UDP帧。缓冲区a对应于帧中的字节16-31。根据某些条件,这些字节将被覆盖或设置为0,b的长度始终为12。

def foo(b=12*[0]):
    a = 16*[0]
    return a[:12] = b[:]

4 个答案:

答案 0 :(得分:3)

>>> a[:len(b)] = b[:]
>>> a
[1, 2, 3, 0, 0]

答案 1 :(得分:1)

这适用于Python 2:

import itertools
a = [0, 0, 0, 0, 0]
b = [1, 2, 3]
g = (l | r for (l, r) in itertools.izip_longest(a, b, fillvalue=0))
print list(g)

这在Python 3中:

import itertools
a = [0, 0, 0, 0, 0]
b = [1, 2, 3]
g = (l | r for (l, r) in itertools.zip_longest(a, b, fillvalue=0))
print(list(g))

我创建了一个生成器g,但如果您事先知道它已经想要它的所有值,那么可以立即获得列表理解。

这是zip_longest的文档:https://docs.python.org/3/library/itertools.html#itertools.zip_longest

直接使用列表推导(py3):

import itertools
a = [0, 0, 0, 0, 0]
b = [1, 2, 3]
g = [l | r for (l, r) in itertools.zip_longest(a, b, fillvalue=0)]
print(g)

答案 2 :(得分:1)

为什么要浪费时间来定义a?您只需将0的{​​{1}}添加到b即可:

>>> b = [1, 2, 3]
>>> a = b + [0] * (5 - len(b))
>>> a
[1, 2, 3, 0, 0]

答案 3 :(得分:0)

这样的事情(注意:XOR运算符是^

import itertools

a = [0, 0, 0, 0, 0]
b = [1, 2, 3]

def safeXOR(arr1, arr2):
    return list((x ^ y for (x, y) in itertools.zip_longest(arr1, arr2, fillvalue=0)))

print(safeXOR(a,b))