2014-02-20 38 views
3

是否可以拆分列表中的项目并随时生成新列表? 基本上我得到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] 
+1

你为什么不使用lambda funtion? – Trimax

回答

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] 

BTW,不要使用input作为变量名。它影响内置函数input

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] 
+0

'byteswap'应该有条件地完成。 (取决于'sys.byteorder') – falsetru

+0

falsetru:这真的取决于OP想要做什么。 –

+0

我的意思是答案中的代码在大端系统中不会产生相同的输出。您添加了'byteswap'来使结果与问题中的'out'匹配。你不是吗? – falsetru

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]