如何创建一个包含整体子列表的新列表,但是当下一个数字是最小值(或等于第一个建立的值)时,它的划分方式是什么?
例如
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时附加它。但是它不起作用,因为它不会在其中创建另一个列表。
我是否必须为此问题找到正则表达式?
一些指导会非常有用。
谢谢
答案 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,从而在列表中创建列表。