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

Joining elements in a list to a new list in Python

我看到这个问题,但它对我的问题没什么帮助。

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

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

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0000000FFF77F7FFF2A1412F4B8058A891982070
F1885C08883C7A880018980B7A50E24AA8004E4C
5D38103F3C910810009941B91088F7D509008980
009980809F7C28008880B7B935A88A0208118C3B
C251881F4C00B1408088A1398007F1980259C800
A108892278E879B383F04B0B50188191F1888189
A9608080980808080E7E40080989080018A860D3
F4C800001C7A100810C90B8302118980FC508923
B888D782BD8283B802902902A7CB589008802080
90097F3A8A061C81880B7B40A9249A008E022E6D
20B22D923E9690A80121AB97E4A8800013D5E5B8
490992228F02A14AC00A419990971B2888009988
8A2698289A70C00B039A3A74D2098AE7B18828
3F1C5201D3F1A000811081190988808080808008
0808800880080808800080008881880919880A10

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

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

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


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

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


据我所知,您有字符串列表,需要一个新的字符串列表,其中每个字符串都具有指定的块长度。一个简单的方法是将列表join转换成一个字符串,然后再将其修改。演示:

1
2
3
4
5
6
>>> 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,你应该走了。如果我误解了你们的规格,请留下评论。


最简单的事情是使用递归,这是相对容易理解的…

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

pythons处理列表的方式使您不必担心l[13:]l[:13]部分,当len(l) < 13时。

注意,这可能是尾部递归。不幸的是,我不确定这是否会在Python解释器中真正结束递归,但大多数现代编译器都能够自动为您完成这项工作。在Python中,您必须调用自己的迭代器方法,这对于类似这样的简单代码来说有点过分了。


链接问题对您没有帮助的原因是,您的问题与"加入"列表没有任何关系,而是与对列表进行分区有关。您只需要将列表分成13个元素的单独列表。这个问题有一些很好的解决办法。