在如下列表中:
biglist = ['X', '1498393178', '1|Y', '15496686585007',
'-82', '-80', '-80', '3', '3', '2', '|Y', '145292534176372',
'-87', '-85', '-85', '3', '3', '2', '|Y', '11098646289856',
'-91', '-88', '-89', '3', '3', '2', '|Y', '35521515162112',
'-82', '-74', '-79', '3', '3', '2', '|Z',
'0.0', '0.0', '0', '0', '0', '0', '0', '4', '0', '154']
可能有一些数字元素前面有一个字符。我想把它分成如下的子列表:
smallerlist = [
['X', '1498393', '1'],
['Y', '1549668', '-82', '-80', '-80', '3', '3', '2', ''],
['Y', '1452925', '-87', '-85', '-85', '3', '3', '2', ''],
['Y', '3552151', '-82', '-74', '-79', '3', '3', '2', ''],
['Z', '0.0', '0.0', '0', '0', '0', '0', '0', '4', '0', '154']
]
如您所知,根据角色的不同,列表可能看起来很相似。否则它们可能有不同数量的元素,或者完全不同的元素。主要分隔符是 "|"
字符。我试图运行以下代码来拆分列表,但我得到的只是列表中的相同、更大的列表。即,列表 len(list) == 1
。
import itertools
delim = '|'
smallerlist = [list(y) for x, y in itertools.groupby(biglist, lambda z: z == delim)
if not x]
任何想法如何成功拆分它?
原文由 omrakhur 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,一个快速的 oneliner ,就空间要求而言,这不是最佳解决方案,但它又短又好:
在这里,我们通过一个唯一的未出现的分隔符连接大列表的所有元素,例如
,
,然后通过|
拆分,然后再次将每个列表拆分为原始列表的子列表元素。但是,如果您正在寻找更 有效的解决方案,您可以使用
itertools.groupby
来实现,它将在中间列表上运行,使用breakby()
生成器即时生成,其中元素没有|
分隔符按原样返回,那些有分隔符的元素被分成 3 个元素:第一部分,一个列表分隔符(例如None
)和第二部分。