Python根据条件

时间:2017-11-08 01:27:14

标签: python arrays for-loop append

我有一个列表/ 数组(可以使它们成为数组,无关紧要)

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+=1b+=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.停止。

4 个答案:

答案 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]]
    

    UPD。

    或者,我们可以用索引来实现它 (基于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