我想提取特殊元素“ -break-”之间的元素组。然后将这些组存储到新列表中。
这是输入列表:
app.get('/', function (req, res) {
throw new Error('BROKEN') // Express will catch this on its own.
})
输出列表应为:
main_list = [ '-break-',
'one',
'two',
'-break-',
'three',
'-break-',
'four',
'five',
'six'
'-break-',
'seven',
'eight',
'nine',
'ten'
]
答案 0 :(得分:1)
这是使用itertools.groupby
的一种方法:
from itertools import groupby
out = [[*v] for k,v in groupby(main_list, key= lambda x: x != '-break-') if k]
print(out)
[['one', 'two'],
['three'],
['four', 'five', 'six'],
['seven', 'eight', 'nine', 'ten']]
itertools.groupby
将相等的连续值分组在一起。但是,当提供key
时,将应用相同的逻辑,但使用key
函数的结果。在这种情况下,key
函数将生成以下值:
[x != '-break-' for x in main_list]
# [False, True, True, False, True, False, True, True, True, True, True, True, True]
因此,在每次迭代中,我们将收到一个由分组键(tuple
或True
)组成的False
和一个带有相应值的列表。因此,为了仅保留分组键为True
的那些密钥,我们只需要添加if k
作为条件。
答案 1 :(得分:0)
巨大的一线。可以简化一下:
new_list = [[y for y in x.split(',') if y] for x in ','.join(main_list).split('-break-') if x]
以下是列表理解的更清晰视图:
[
[
y
# Split all the elements by ","
for y in x.split(',')
# Filter out empty values
if y
]
# Join everything with "," and then split it by "-break-"
for x in ','.join(main_list)
.split('-break-')
# Filter out empty values
if x
]