分组元素,后跟列表中的重复键

时间:2019-12-18 11:28:26

标签: python python-3.x list grouping itertools

如何在Python中将lst中的元素分组到以'S'开头的子列表中?

lst = ['S', 'one', 'two', 'S', 'three', 'S', 'four', 'five', 'six']

我想要什么:

[['S', 'one', 'two'], ['S', 'three'], ['S', 'four', 'five', 'six']]

编辑:

如果现在lst = ['"A"', 'one', 'two', '"B"', 'three', '"C"', 'four', 'five', 'six']会怎样?前几个元素并不完全相同,但是有一些共同点,即引号。

2 个答案:

答案 0 :(得分:3)

使用简单的迭代。

例如:

lst = ['S', 'one', 'two', 'S', 'three', 'S', 'four', 'five', 'six']
res = []
for i in lst:
    if i =="S":
        res.append([i])
    else:
        res[-1].append(i) 
print(res)

输出:

[['S', 'one', 'two'], ['S', 'three'], ['S', 'four', 'five', 'six']]

问题已编辑。

使用str.startswithstr.endswith

例如:

lst = ['"A"', 'one', 'two', '"B"', 'three', '"C"', 'four', 'five', 'six']
res = []
for i in lst:
    if i.startswith('"') and i.endswith('"'):
        res.append([i])
    else:
        res[-1].append(i) 
print(res)
# --> [['"A"', 'one', 'two'], ['"B"', 'three'], ['"C"', 'four', 'five', 'six']]

答案 1 :(得分:2)

您可以使用itertools.groupby

>>> from itertools import groupby
>>> [['S']+list(g) for k,g in groupby(lst,lambda x:'S' in x) if not k]
[['S', 'one', 'two'], ['S', 'three'], ['S', 'four', 'five', 'six']]