(Python 3) Разделение списка с использованием уникальных элементов в качестве разделителей - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть список l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101], и я хотел бы разбить l на подсписки [2,3,4,5,6], [7,8,9,10,11,12],[13,14,15,16,17,18], что означает, что я использую цифры-разделители 99,100,101, которые принадлежат separators = [99,100,101] в качестве флага, чтобы указать, куда мне следует идти к следующему списку.

В частности, эти подсписки могут не иметь одинакового количества элементов, но различаются по размеру только 1 (5 или 6). Примечание: может быть более 3 разделителей.

Есть ли эффективный способ сделать это в Python 3? Я подумал о том, чтобы сначала извлечь индексы элементов-разделителей, а затем соответствующим образом нарезать список, но он кажется слишком сложным и требует значительных вычислительных ресурсов.

Некоторое понимание будет отличным!

Добавление (предложение от @Netwave): Моя попытка (которая явно не работает):

g = []
for i in l:
    if i in separators:
        g += [l[:l.index(i)]]

Выход:

>>> g
[[2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18]]

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Легче для использования в функции:

import itertools
def split(l,l2):
    return [list(v) for k,v in itertools.groupby(l,lambda x: x in l2) if not k]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]
print(split(l,[99, 100, 101]))

Выход:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

Реализован дубликат Разделить список на вложенные списки по значению

0 голосов
/ 07 ноября 2018

Я надеюсь, что вы ищете что-то похожее на приведенный ниже код. Вам нужно перебрать свой список и продолжать проверять, присутствует ли элемент в списке разделителей. Это можно сделать другим способом, как вы сказали, перебирая список разделителей и находя индекс элементов в основном списке. Ради простоты я выбрал первый подход. (Запишите использование переменной endindex):

l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101]
seperator = [99,100,101]

list_of_list = []
endindex = 0
for i in range(0,len(l),1):
    if l[i] in seperator:
        list_of_list.append(l[endindex:i])
        endindex = i + 1

print(list_of_list)

Ouput:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]
0 голосов
/ 07 ноября 2018

Использование groupby :

from itertools import groupby

separators = [99, 100, 101]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]

splits = [list(values) for key, values in groupby(l, key=lambda x: x not in separators) if key]

print(splits)

выход

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]
...