是否可以在列表中拆分项目并动态生成新列表? 基本上我得到了一个ushort的列表,并希望生成一个ubytes列表:
input = [1036, 1055, 26, 29787, 9, 4206, 41, 7, 1036, 8302, 130, 4, 268, 4206]
out = [4, 12, 4, 31, 0, 26, 116, 91, 0, 9, 16, 110, 0, 41, 0, 7, 4, 12, 32, 110, 0, 130, 0, 4, 1, 12, 16, 110]
我可以非常轻松地生成元组列表,但是如何删除元组并将它们合并到一个大列表中呢?
out_temp = [(x>>8, x&0xFF) for x in input]
答案 0 :(得分:6)
您可以这样使用列表理解:
>>> in_ = [1036, 1055, 26, 29787, 9, 4206, 41, 7, 1036, 8302, 130, 4, 268, 4206]
>>> [y for x in in_ for y in (x >> 8, x & 0xff)]
[4, 12, 4, 31, 0, 26, 116, 91, 0, 9, 16, 110, 0, 41, 0, 7, 4, 12, 32, 110, 0, 130, 0, 4, 1, 12, 16, 110]
或使用itertools.chain.from_iterable
:
>>> import itertools
>>> list(itertools.chain.from_iterable((x >> 8, x & 0xff) for x in in_))
[4, 12, 4, 31, 0, 26, 116, 91, 0, 9, 16, 110, 0, 41, 0, 7, 4, 12, 32, 110, 0, 130, 0, 4, 1, 12, 16, 110]
顺便说一句,不要使用input
作为变量名。它影响内置函数input
。
答案 1 :(得分:1)
根据您对转化数据的处理方式,您可能也会对array.array
感兴趣。
>>> a = array.array("H", input)
>>> a.byteswap()
>>> a.tostring()
'\x04\x0c\x04\x1f\x00\x1at[\x00\t\x10n\x00)\x00\x07\x04\x0c n\x00\x82\x00\x04\x01\x0c\x10n'
>>> list(bytearray(a.tostring()))
[4, 12, 4, 31, 0, 26, 116, 91, 0, 9, 16, 110, 0, 41, 0, 7, 4, 12, 32, 110, 0, 130, 0, 4, 1, 12, 16, 110]
答案 2 :(得分:0)
正如此SO question中所指出的,您还可以使用generator函数:
input_data = [1036, 1055, 26, 29787, 9, 4206, 41, 7, 1036, 8302, 130, 4, 268, 4206]
def convert(x):
for i in x:
yield i>>8
yield i&0xFF
print list(convert(input_data))
结果
[4, 12, 4, 31, 0, 26, 116, 91, 0, 9, 16, 110, 0, 41, 0, 7, 4, 12, 32, 110, 0, 130, 0, 4, 1, 12, 16, 110]