Я пытался извлечь списки из кортежа с условием, что все числа X в порядке возрастания должны быть извлечены в один и тот же список, используя понимание списка.
Пример:
(4,2,2,3,5,6,0,0,2)
[[4],[2,2,3,5,6],[0,0,2]]
Я пробовал следующее:
E=tuple([random.randint(0,10) for x in range(10)])
Res=[E[x:y] for x in range(0,len(E)) for y in range(x+1,len(E)) if (y>x)]
Извлеките N чисел внутри списка [], которые находятся в порядке возрастания из кортежа, используя понимание списка.
Почему вы должны использовать понимание списка?
Вот один из возможных способов сделать это. Вы можете использовать np.split вместе с random.sample, чтобы получить случайные числа, которые используются в качестве индекса для разделения.
import random
import numpy as np
lst = [4,2,2,3,5,6,0,0,2]
number_of_splits = 4
random.seed(42)
random_splits = sorted(random.sample(set(range(1,len(lst)-1)),number_of_splits-1))
print(random_splits)
result = [list(elem) for elem in np.split(lst, random_splits)]
print(result)
[1, 6, 7]
[[4], [2, 2, 3, 5, 6], [0], [0, 2]]
Вероятно, проще сделать это без понимания списка, то есть с помощью простого цикла, подобного этому:
from random import randint as RANDINT
t = 4, 2, 2, 3, 5, 6, 0, 0, 2
out = []
offset = 0
while offset < len(t):
e = RANDINT(1, len(t)+1-offset)
out.append(list(t[offset:offset+e]))
offset += e
print(out)
Вывод (пример):
[[4], [2, 2], [3], [5, 6, 0, 0], [2]]
Мы можем использовать срез, чтобы отметить начало и конец подсписков.
t=(4,2,2,3,5,6,0,0,2)
split_list=[0]+[x for x in range(len(t)) if t[x]<t[x-1]]
split_list_end=[x for x in range(len(t)) if t[x]<t[x-1]]
split_list_end.append(len(t))
[list(t[x]) for x in [slice(x[0],x[1]) for x in list(zip(split_list,split_list_end))]]
Здесь простая логика для создания нового списка уже с кортежем первого элемента. а затем перебрать кортеж, и если его текущий элемент меньше последнего элемента или нет, если он меньше, то append element as a list
или append element into the last list
.
Код:
import random
E=tuple([random.randint(0,10) for x in range(10)])
E
ls=[[E[0]]]
[ls.append([E[e]]) if E[e]<E[e-1] else ls[len(ls)-1].append(E[e]) for e in range(1, len(E)) ]
ls
ИЛИ Без предварительного определения первого значения
from itertools import pairwise
l=[[]]
[l[len(l)-1].append(y) if x-y < 0 else l.append([y]) for (x, y) in pairwise([e for e in (0,)+E])] ##Insert the dump 0 at first position
l
Ввод: (7, 10, 7, 2, 3, 7, 4, 3, 5, 10)
Выход: [[7, 10], [7], [2, 3, 7], [4], [3, 5, 10]]
Ввод: (0, 3, 4, 3, 0, 7, 0, 0, 2, 3)
Выход: [[0, 3, 4], [3], [0, 7], [0, 0, 2, 3]]
твой вопрос не ясен