разделить вложенный список на подсписки по значениям int - PullRequest
1 голос
/ 13 мая 2019

У меня есть два списка:

 data = [[1,2,3,4], [5,6,7], [8,9,10,11,12,13,14]]
 splitters = [3,7,10,13]

Я хочу разделить вложенные списки в data на значения в splitter со следующими условиями:

  1. Не разбивать, если это первое / последнее значение в списке.
  2. Значение разделения в разделителе должно быть в конце и в начале новых списков.
  3. Должно быть как-то итеративно, поэтому списки разделяются какв списке много частей как разделителей.
  4. Нет избыточности.

Окончательный результат должен выглядеть примерно так:

results = [[1,2,3],[3,4],[5,6,7],[8,9,10],[10,11,12,13],[13,14]

Моя первая попытка выглядит следующим образом:

temp = []
for route in data:
    for node in route:
        if node in splitter and ((route.index(node) !=0) and (route.index(node) != (len(route)-1))):
            #route should be splitted and save it for now with the splitter
            temp.append([route, node])
            #here a big part is missing
                 #start a new subroute
                 #maybe something like a whileloop with len(route)
                 #check the same if-statement for the remaining subroute
        else:
            #no splitter in this route, so keep the original route
            temp.append([route, 0])

temp выглядит так:

[[[1, 2, 3, 4], 0],
 [[1, 2, 3, 4], 0],
 [[1, 2, 3, 4], 3],
 [[1, 2, 3, 4], 0],...]

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

Мое исследование пока не было успешным (с использованием itertools.groupby и т. д.).Это как бы связано: https://www.reddit.com/r/learnpython/comments/3sk1xj/splitting_a_list_in_sublists_by_values/

Буду признателен за некоторые идеи / подходы, как решить эту проблему или поделить ее на более мелкие части.

Редактировать для будущих читателей: Я предпочитаю решение от maxiotic, потому что оно работает даже с такими данными, как

data = [[1,2,3],[1,2,3,4,5,6,7]]
splitters = [1,2,3,4,7]

, где каждый начало / конец вложенных списков находится в разделителях.Проблема в решении от Relondom заключается в следующем, если утверждение и должно быть изменено:

    if inner[0] in splitters or inner[-1] in splitters:  # check if first or last elemtn in splitters

Большое спасибо!

Ответы [ 2 ]

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

Вот мое решение, над которым я работал:

results = []
for route in data:
    found = 0
    for idx, r in enumerate(route[1:-1], 1):  # start idx at 1
        if r in splitters:
            temp = route[found:idx+1]  # +1 to capture the splitter value
            results.append(temp)
            found = idx 
    remaining = route[found:]
    results.append(remaining)
0 голосов
/ 13 мая 2019

Понятия не имею, если это оптимальный путь, но я решил написать этот код, так как никто еще не ответил.

res = []
for inner in data:
    if inner[0] in splitters or inner[-1] in splitters:  # check if first or last elemtn in splitters
        res.append(inner) 
        continue
    else:
        temp = []  
        for val in inner:
            if val not in splitters:
                temp.append(val)
            else:
                temp.append(val)  # list ends with value from splitters
                res.append(temp)  # add new list to result
                temp = [val]  # new list starts with value from splitters
        if temp not in res:
            res.append(temp)
...