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']
。
注意:新列表的顺序不会只改变压缩字符串,包括' _'进入清单。
答案 0 :(得分: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']]
现在你编写了一些代码,这里有一种将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']
但是,使用列表列表可能比使用混合类型(列表和字符串)的列表更容易。
答案 1 :(得分:0)
这可以通过以下代码实现:
lst = ['a_app','a_bla','a_cat','b','c','d_d1','d_xe','d_c','e_1','e_2',f]
new_lst = []
tmp = [] # This will be used to group elements like 'a_app' and 'a_bla'.
for el in lst:
# If _ is not in string, we add the string directly to new_lst
# and continue with next string.
if '_' not in el:
new_lst.append(el)
continue
# If tmp is empty, we just add the current string. It obviously
# contains _, otherwise we wouldn't get there (above if clause).
if tmp == []:
tmp.append(el)
continue
# Compare first letter of current string with the first letter of
# first string in tmp. If it is the same, add current string to tmp.
if el[0] == tmp[0][0]:
tmp.append(el)
# If it is not the same, that means that tmp is ready to be appended
# new_lst. We must also reset the tmp.
else:
new_lst.append(tmp)
tmp = []