使用给定项目拆分列表

时间:2019-05-30 15:31:51

标签: python list

我想提取特殊元素“ -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'  
         ]

2 个答案:

答案 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]

因此,在每次迭代中,我们将收到一个由分组键(tupleTrue)组成的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
]