合并2字节数组的最佳方法是什么?

2024-10-03 00:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有2个bigs数组(我在这个例子中放了更小的数组):

a1=bytes([10,20,30,40,50,60,70,80])
a2=bytes([11,21,31,41,51,61,71,81])

我要做的是这样合并这两个数组:

^{pr2}$

我想要的是从第一个数组取2个字节,然后从第二个数组取2个字节,等等

这就是我所做的。它是可行的,但我认为有一个最好的方法来做到这一点,而不必创建中间产物数组:

a3 = bytearray()
for i in range(0, len(a1), 2):
    a3.append(a1[i])
    a3.append(a1[i+1])
    a3.append(b1[i])
    a3.append(b1[i+1])

output_array=bytes(a3)  # Very important: i need bytes() object at the end

Tags: 方法a2for字节bytesa1数组a3
3条回答

从这里获取的块:How do you split a list into evenly sized chunks?
从这里合并:How do I merge two lists into a single list?

合并为:

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

a1 = [10,20,30,40,50,60,70,80]
b1 = [11,21,31,41,51,61,71,81]
combined = [j for i in zip(chunks(a1, 2),chunks(b1, 2)) for j in i]
out = bytes(bytearray([x for pair in combined for x in pair]))
==> b'\n\x14\x0b\x15\x1e(\x1f)2<3=FPGQ'

您可以使用切片分配来执行此操作:

a1 = bytes([10,20,30,40,50,60,70,80])
a2 = bytes([11,21,31,41,51,61,71,81])

n = len(a1)

a3 = bytearray(2*n)
a3[0::4] = a1[0::2]
a3[1::4] = a1[1::2]
a3[2::4] = a2[0::2]
a3[3::4] = a2[1::2]
a3 = bytes(a3)

输出:

^{pr2}$

Edit方法

def gen(a1, a2):
    i1 = iter(a1)
    i2 = iter(a2)
    while True:
        for it in i1, i1, i2, i2:
            try:
                yield next(it)
            except StopIteration:
                return

a3 = bytes(gen(a1, a2))

这是另一种选择:

a1=bytes([10,20,30,40,50,60,70,80])
a2=bytes([11,21,31,41,51,61,71,81])

merged = bytes((a1 if (i&3)<2 else a2)[i-(i&2)-2*(i>>2)]
               for i in range(2*len(a1)))

相关问题 更多 >