Разделить список с использованием данного элемента - PullRequest
1 голос
/ 30 мая 2019

Я хочу извлечь группы элементов между специальными элементами '-break-'.И затем сохраните эти группы в новый список.

Это список ввода:

main_list = [ '-break-',
          'one',
          'two',
          '-break-',
          'three',
          '-break-',
          'four',
          'five',
          'six'
          '-break-',
          'seven',
          'eight',
          'nine',
          'ten'  
         ]

Список вывода должен быть:

new_list = [ ['one', 'two'],
         ['three'],
         ['four', 'five', 'six'],
         ['seven', 'eight', 'nine', 'ten'],
        ]

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вот один подход с использованием 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 в качестве условия.

0 голосов
/ 30 мая 2019

Массивная однострочная.Возможно, это можно упростить:

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
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...