Предположим, у меня есть 2 больших массива (в этом примере я поместил меньшие массивы):
a1=bytes([10,20,30,40,50,60,70,80])
a2=bytes([11,21,31,41,51,61,71,81])
Что я хочу сделать, это объединить эти 2 массива следующим образом:
[10,20 , 11,21 , 30,40 , 31,41 , ...
Я хочу взять 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
4 ответа
Чанк взят здесь: Как разделить список на куски одинакового размера?
Объединение взято отсюда: Как объединить два списка в один список?
Объединено в это:
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)
Выход:
>>> a3
b'\n\x14\x0b\x15\x1e(\x1f)2<3=FPGQ'
>>> list(a3)
[10, 20, 11, 21, 30, 40, 31, 41, 50, 60, 51, 61, 70, 80, 71, 81]
Изменить. Вот метод без промежуточных копий.
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)))
Используя назначения срезов непосредственно в байтах
a1 = bytes([10,20,30,40,50,60,70,80])
a2 = bytes([11,21,31,41,51,61,71,81])
a3 = bytes()
for i in range(int(len(a1)/2)):
a3 += a1[i*2:i*2+2] + a2[i*2:i*2+2]
# a3 = b'\n\x14\x0b\x15\x1e(\x1f)2<3=FPGQ'
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.