将列表中的元素连接到Python中的新列表

时间:2014-06-20 08:32:03

标签: python list

我看到了this question,但它对我的问题没什么帮助。

我有一个字符串列表,其中12个第一项是20个字节长(40个字符),13个是19个字节(38个字符),这将继续列表的其余部分,任意大小(我正在解码没有给定大小的音频记录)。

for packet in adpcm_packets[0:15]:
    print packet

输出:

0000000FFF77F7FFF2A1412F4B8058A891982070
F1885C08883C7A880018980B7A50E24AA8004E4C
5D38103F3C910810009941B91088F7D509008980
009980809F7C28008880B7B935A88A0208118C3B
C251881F4C00B1408088A1398007F1980259C800
A108892278E879B383F04B0B50188191F1888189
A9608080980808080E7E40080989080018A860D3
F4C800001C7A100810C90B8302118980FC508923
B888D782BD8283B802902902A7CB589008802080
90097F3A8A061C81880B7B40A9249A008E022E6D
20B22D923E9690A80121AB97E4A8800013D5E5B8
490992228F02A14AC00A419990971B2888009988
8A2698289A70C00B039A3A74D2098AE7B18828
3F1C5201D3F1A000811081190988808080808008
0808800880080808800080008881880919880A10

现在,我想要一个新的列表,其中每个元素包含13个数据包,即12 * 40 + 1 * 38 = 518个字符(259个字节)。

blocks.append(adpcm_packets[0])
    for packet in adpcm_packets[1:13]:
        blocks[0] += packet

然后我被困在如何用列表的其余部分做这个。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

我不完全确定我理解你的问题,但是你正在寻找这样的事情吗?

blocks = ["".join(adpcm_packets[i:i+13]) for i in range(0, len(adpcm_packets), 13)]

答案 1 :(得分:1)

据我了解你的问题,你有字符串列表,你想要一个新的字符串列表,其中每个字符串具有指定的块长度。一个简单的方法是将join列表转换为单个字符串,然后再将其破解。演示:

>>> lst = ['hello', 'world', 'how', 'are', 'you?']
>>> mystr = ''.join(lst)
>>> chunk = 5
>>> newlst = [mystr[i:i+chunk] for i in range(0,len(mystr),chunk)]
>>> newlst
['hello', 'world', 'howar', 'eyou?']

将您的chunk更改为518,您应该好好去。如果我误解了你的规格,请发表评论。

答案 2 :(得分:0)

链接问题对您没有帮助的原因是您的问题与"加入"无关。列表,但分区列表。您只想将列表分成13个元素的单独列表。 This question有一些很好的解决方案。

答案 3 :(得分:0)

最简单的方法是使用相对容易理解的递归...

def f(l):
    if l==[]: return []
    else: return [ ''.join(l[:13])  ] +  f( l[13:])  

Pythons处理列表的方式允许您在l[13:]时不必担心l[:13]len(l) < 13部分。

请注意,可能是尾递归。不幸的是,我不确定这是否会在Python解释器中真正实现尾递归,但大多数现代编译器都能够自动为您执行此操作。在Python中,您将不得不调用自己的迭代器方法,这对于像这样的简单代码来说有点过分。