Необходимо разбить список на части по заданному правилу c - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующий список списков (внутренние списки в дальнейшем будут называться кортежами, чтобы избежать путаницы):

[[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [4, 1], [3, 3], [4, 2], [5, 1], [4, 3], [5, 2], [6, 1], [4, 4], [5, 3], [6, 2], [7, 1]]

и я хотел бы создать еще один список, содержащий:

[[[1, 1]], [[2, 1], [2, 2]], [[3, 1], [3, 2]], [[4, 1], [3, 3], [4, 2]], [[5, 1], [4, 3], [5, 2]], [[6, 1], [4, 4], [5, 3], [6, 2]], [[7, 1]]]

В основном я просматриваю список кортежей и помещаю кортежи в подсписки, пока не попаду в кортеж с первой координатой выше, чем у предыдущих (курсивом исправление на основе комментария, я имел в виду это, но пока писал, пропустил). Например, первый элемент - это [1,1], а следующий - [2,1], но поскольку 2> 1, первый подсписок - [[1,1]]. Опять же, когда мы нажимаем [3,1], создается второй подсписок [[2,1],[2,2]] и т. Д.

Как мне реализовать это в python? Конкретно python 3?

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Следующее решение предполагает, что входные данные никогда не являются пустым списком:

d  = [[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [4, 1], [3, 3], [4, 2], [5, 1], [4, 3], [5, 2], [6, 1], [4, 4], [5, 3], [6, 2], [7, 1]]

d2 = [[d[0]]]
for t in d[1:]:
  if t[0] > d2[-1][0][0]:
    d2.append([t])
  else:
    d2[-1].append(t)

print(d2)

Следующее соответствует случаю, когда входные данные являются пустым списком:

d2 = []
for t in d:
  if (not d2) or (t[0] > d2[-1][0][0]):
    d2.append([t])
  else:
    d2[-1].append(t)
1 голос
/ 27 мая 2020
a = [[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [4, 1], [3, 3], [4, 2], [5, 1], [4, 3], [5, 2], [6, 1], [4, 4], [5, 3], [6, 2], [7, 1]]

def cummax(v):
    x = v[:1]
    for i in v:
       x.append(x[-1] if x[-1] > i else i)
    return x

d = {} 
for i,j in zip(cummax([i for i,j in a]), a):
    if not d.get(i):
        d[i]=[]
    d[i].append(j)
list(d.values())

[[[1, 1]], [[2, 1], [2, 2]], [[3, 1], [3, 2]], [[4, 1], [3, 3], [4, 2]], [[5, 1], [4, 3], [5, 2]], [[6, 1], [4, 4], [5, 3], [6, 2]], [[7, 1]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...