如何在不改变序列顺序的情况下将包括"_"的不同列表元素分组到列表中?

Jac*_*ack 0 python

rawinput:

lst = ['a_app','a_bla','a_cat','b','c','d_d1','d_xe','d_c','e_1','e_2','f']

元素lst是字符串

预期结果:

new_lst = [['a_app','a_bla','a_cat'],'b','c',['d_d1','d_xe','d_c'],['e_1','e_2'],'f']

任何元素包括'_'将被分组到列表元素中,但是如果不同,它们的开始将被分组到不同的列表中,例如['a_app','a_bla','a_cat'], ['d_d1','d_xe','d_c'].

注意:新列表的顺序不会仅将包含"_"的压缩字符串更改为列表.

Eri*_*nil 5

你可以使用itertools.groupby:

>>> from itertools import groupby
>>> lst = ['a_app','a_bla','a_cat','b','c','d_d1','d_xe','d_c','e_1','e_2','f']
>>> [list(strs) for _,strs in groupby(lst, lambda s: s.split('_')[0])]
[['a_app', 'a_bla', 'a_cat'], ['b'], ['c'], ['d_d1', 'd_xe', 'd_c'], ['e_1', 'e_2'], ['f']]
Run Code Online (Sandbox Code Playgroud)

既然你编写了一些代码,这里有一种将1元素子列表转换为字符串的方法:

>>> new_list = [list(strs) for _,strs in groupby(lst, lambda s: s.split('_')[0])]
>>> [strs if len(strs) > 1 else strs[0] for strs in new_list]
[['a_app', 'a_bla', 'a_cat'], 'b', 'c', ['d_d1', 'd_xe', 'd_c'], ['e_1', 'e_2'], 'f']
Run Code Online (Sandbox Code Playgroud)

但是,使用列表列表可能比使用混合类型(列表和字符串)的列表更容易.

  • 谢谢,我会根据你的提示做到这一点:lst =`['a_app','a_bla','a_cat','b','c','d_d1','d_xe','d_c','e_1 ','e_2','f'] imp = [list(strs)for _,strs in groupby(lst,lambda s:s.split('_')[0])] new_lst = [] for i in imp :如果len(i)== 1:new_lst.append(''.join(i))else:new_lst.append(i)` (2认同)