从具有条件的元组中提取列表



我试图从一个元组中提取列表,条件是每个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)]

这里,简单的逻辑来创建新的列表已经与第一个元素元组。然后循环遍历元组,如果它的当前元素小于最后一个元素,如果它小于append element as a listappend 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]]

这是一种可能的方法。您可以将np.splitrandom.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]]

我们可以使用slice来标记子列表的开始和结束

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))]]

最新更新