在到达数字之前创建新列表

时间:2017-05-23 18:18:53

标签: python python-2.7 python-3.x

如何创建一个包含整体子列表的新列表,但是当下一个数字是最小值(或等于第一个建立的值)时,它的划分方式是什么?

例如

List1=[1,2,3,4,5,1,2,3,4,1,2,3,4,5,6]

我正在寻找的输出如下所示:

Complete_List=[[1,2,3,4,5],[1,2,3,4],[1,2,3,4,5,6]]

我尝试循环遍历列表并在值大于1时附加它。但是它不起作用,因为它不会在其中创建另一个列表。

我是否必须为此问题找到正则表达式?

一些指导会非常有用。

谢谢

4 个答案:

答案 0 :(得分:3)

这是在给定值上拆分通用迭代的东西。

def split_on_value(iterable, split_value):
    iterator = iter(iterable)
    outer, inner = [], [next(iterator)]

    for value in iterator:
        if value == split_value:
            outer.append(inner)
            inner = []
        inner.append(value)

    outer.append(inner)
    return outer


value_list = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4, 5, 6]

print split_on_value(value_list, 1)
# [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2, 3, 4, 5, 6]]

print split_on_value(value_list, 3)
# [[1, 2], [3, 4, 5, 1, 2], [3, 4, 1, 2], [3, 4, 5, 6]]

答案 1 :(得分:1)

首先搜索1或者您的条件,并获取列表中的索引。不要忘记附加len(list)以包含最后一段。

idx = [i for i, l in enumerate(List1) if l == 1] + [len(List1)]

可选,如果您想要List的开头。也就是说,您不知道始终在索引0处是否存在1

idx = [0] + idx if idx[0] != 0 else idx

然后,将列表拆分为您找到的那些索引。

complete_list = [List1[ind1:ind2] for ind1, ind2 in zip(idx[:-1], idx[1:])]

结果:

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

答案 2 :(得分:1)

一款简洁明了的CS101解决方案。虽然,可能是最有效的一个,因为它只扫描列表一次。它也不假设段以1开头。

fragment = []
result = []
prev = List1[0] - 1 # Preset the previous element marker

for n in List1:
  if n > prev:
    fragment.append(n)
  else:
    result.append(fragment)
    fragment = [n]
  prev = n

result.append(fragment)
#[[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2, 3, 4, 5, 6]]

答案 3 :(得分:0)

您可以尝试在每个1:

的实例中进行拆分
List1=[1,2,3,4,5,1,2,3,4,1,2,3,4,5,6]

print [map(int, list("1"+i)) for i in ''.join(map(str, List1)).split("1")][1:]

通过使用字符串函数映射List1,我们可以将列表中的所有数字连接成一个大字符串。从那里,算法在每个实例中分裂自己,创建包含新数字串的列表。从那里开始,代码将整数函数映射到由字符串创建的列表上,并在字符串前面附加1以补偿最初拆分时丢失的1,从而在列表中创建列表。