拆分列表中的每个项目

时间:2014-02-20 12:24:46

标签: python list

是否可以在列表中拆分项目并动态生成新列表? 基本上我得到了一个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]

3 个答案:

答案 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]