【问题标题】:Python find indices in an array based on conditionsPython根据条件在数组中查找索引
【发布时间】:2018-04-20 13:45:28
【问题描述】:

我有一个列表/数组(可以把它们做成数组,没关系)

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

不幸的是,即使我的想法是正确的,由于IndexError: invalid index to scalar variable.,循环在if i[a]&lt;i[b] 中停止。

【问题讨论】:

  • 那些不是数组。
  • @juanpa.arrivillaga:没关系,我可以让他们numpy arrays或者让他们成为lists
  • 你可以试试print(i),你得到了什么?所以实际上,你需要的是for _ in range(len(array))array[a]array[b]i 已经是 array 中的一个项目。
  • 当然很重要。不仅性能特征不同,numpy 中也不能有交错数组,正如new_array 所暗示的那样
  • @Sraw: 所以你的意思是我必须修改我的for 循环?如果有怎么办?其他一切都正确吗?

标签: python arrays for-loop append


【解决方案1】:

我们可以通过同时形成结果的元素(更准确地说是一对相邻元素)直接遍历数组。

我们用数组第一个元素的子列表初始化我们的结果,然后:

  • 如果下一个元素大于前一个,我们将其添加到最后一个子列表中
  • 否则 - 我们将带有此元素的新子列表添加到结果中。
    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]]
    
  • 【讨论】:

    • 你能解释一下吗?
    • new_array[-1].append(b) 是做什么的?我能理解new_array.append([b])
    • list[-1] 指的是列表中的最后一个元素,在这种情况下,它是另一个列表,我们将其附加到
    • @ThePredator, new_array[-1] 是结果的当前最后一个子列表。在上面的表达式中,我们将b 附加到它
    • @ThePredator, a 是比较需要的,这决定了我们将b 添加到结果中的准确程度
    【解决方案2】:

    这是一个简单的方法,只需跟踪前一个,并检查它是否更小。如果是,则附加到 sub。如果不是,则将 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]]
    

    【讨论】:

      【解决方案3】:
      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]]
      

      【讨论】:

        【解决方案4】:

        我只是检查了两个条件,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
        

        【讨论】:

        • 以上只是一个小例子。我的原始列表中有不同的浮动值。所以我不能使用==1的条件。无论如何,感谢您的努力。
        • 好的。我希望你能得到答案。快乐解决:)
        猜你喜欢
        • 2022-01-16
        • 2013-05-11
        • 1970-01-01
        • 2019-03-18
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        相关资源
        最近更新 更多