我有一个列表/ 数组(可以使它们成为数组,无关紧要):
array = [1,2,1,1,2,3,1,2,1,2,3,1,2,3,4,5]
我想创建一个new_array
FROM array
,如下所示:
new_array = [[1,2],[1],[1,2,3],[1,2],[1,2,3],[1,2,3,4,5]]
我提出的逻辑是从a=0,b=1
开始并循环array
,当array[a] < array[b]
,然后是a+=1
,b+=1
的值时,但如果array[a]>=array[b]
的值为,则附加b
的值:
这是我试过的:
index_1 = [] # This will be the list which will have the FIRST index
index_2 = [] # This will be the list which will have the SECOND index
a = 0
b = 1
for i in array:
if i[a] < i[b]:
a = a+1
b = b+1
elif i[a] >= i[b]:
index_2.append(b)
index_1.append(a)
因此index_1
将拥有第一个索引而index_2
将拥有第二个索引,然后我们可以通过以下方式创建new_array
:
new_array = [(array[start:end]) for start,end in zip(index_1,index_2)]
不幸的是,即使我的想法是正确的,由于if i[a]<i[b]
,循环在IndexError: invalid index to scalar variable.
停止。
答案 0 :(得分:3)
我们可以直接通过元素(更确切地说是由一对相邻元素)直接通过数组形成结果。
我们使用数组的第一个元素的子列表初始化我们的结果,然后:
array = [1,2,1,1,2,3,1,2,1,2,3,1,2,3,4,5]
new_array = [[array[0]]] # assume the array is not empty
for a,b in zip(array, array[1:]):
if a<b:
new_array[-1].append(b)
else:
new_array.append([b])
print(new_array)
# [[1, 2], [1], [1, 2, 3], [1, 2], [1, 2, 3], [1, 2, 3, 4, 5]]
或者,我们可以用索引来实现它 (基于this answer by @fortran)
首先,准备索引以拆分数组:
idxs_to_split = [idx for idx in range(1, len(array)) if not array[idx-1] < array[idx]]
pairs = zip([0] + idxs_to_split, idxs_to_split + [None])
其次,实现分裂本身:
new_array = [array[i:j] for i,j in pairs]
print(new_array)
# [[1, 2], [1], [1, 2, 3], [1, 2], [1, 2, 3], [1, 2, 3, 4, 5]]
答案 1 :(得分:2)
这是一个简单的方法,只需跟踪前一个,并检查它是否更小。如果是,请附加到sub。如果不是,则将sub附加到新列表,然后创建一个新子。总是在最后附加sub。
>>> new_array = []
>>> array = [1,2,1,1,2,3,1,2,1,2,3,1,2,3,4,5]
>>> sub = []
>>> prev = float('-inf')
>>> for x in array:
... if prev < x:
... sub.append(x)
... else:
... new_array.append(sub)
... sub = [x]
... prev = x
...
>>> new_array.append(sub)
>>> new_array
[[1, 2], [1], [1, 2, 3], [1, 2], [1, 2, 3], [1, 2, 3, 4, 5]]
答案 2 :(得分:2)
def g(l):
acc = []
for i in l:
if not acc:
acc.append(i)
else:
if acc[-1] < i:
acc.append(i)
else:
yield acc
acc = [i]
yield acc
这是一个适用于所有迭代的生成器版本。用法类似于
list(g(array))
并提供所需的
[[1, 2], [1], [1, 2, 3], [1, 2], [1, 2, 3], [1, 2, 3, 4, 5]]
答案 3 :(得分:0)
我只检查了两个条件,1。如果下一个元素== 1和2.如果j是列表的最后一个元素。
array = [1,2,1,1,2,3,1,2,1,2,3,1,2,3,4,5]
newList = []
j = 0
k = 0
while j < len(array)-1:
if array[j+1] ==1:
newList.append(array[k:j+1])
k = j+1
if j+2==len(array):
newList.append(array[k:j+2])
k = j + 1
j +=1
print newList