【问题标题】:Split an array according to user defined rules根据用户定义的规则拆分数组
【发布时间】:2020-11-12 02:54:37
【问题描述】:

我是 Python 新手,在如何根据用户定义的规则拆分数组方面非常苦恼。 假设我有一个包含元素的数组:

A=[0,1,2,6,7,8,9,14,15,16]

我想用python把上面的数组分成几组。 所以如果当前元素和下一个元素的间隔小于2,那么它们属于一个组,否则属于不同的组。

所以基本上我希望我的新数组看起来像这样:

B = [[0,1,2] [6,7,8,9] [14,15,16]]

我正在考虑使用 for 循环并循环遍历数组 A,但不太确定该怎么做......

【问题讨论】:

  • 你有没有尝试过?

标签: python arrays for-loop


【解决方案1】:

基本的 for 循环工作

a=[0,1,2,6,7,8,9,14,15,16]

g = []
tmp = [] 
for i in range(len(a)):
   tmp.append(a[i])
   if i==len(a)-1 or a[i+1] - a[i] >= 2:
      g.append(tmp)
      tmp = []

print(g)

输出

[[0, 1, 2], [6, 7, 8, 9], [14, 15, 16]]

【讨论】:

    【解决方案2】:

    您可以迭代您的A 列表,每次A 中的当前值与前一个值之间的差异大于 1 时,在 B 中开始一个新的子列表:

    A=[0,1,2,6,7,8,9,14,15,16]
    
    B = [[A[0]]]
    Bindex = 0
    last = A[0]
    for i in range(1, len(A)):
        if A[i] - last >= 2:
            B.append([A[i]])
            Bindex += 1
        else:
            B[Bindex].append(A[i])
        last = A[i]
    
    print(B)
    

    输出:

    [[0, 1, 2], [6, 7, 8, 9], [14, 15, 16]]
    

    【讨论】:

      【解决方案3】:
      A = [0, 1, 2, 6, 7, 8, 9, 14, 15, 17]
      
      temp = []
      B = []
      for index, value in enumerate(A):
          if index != 0 and value - A[index-1] >= 2:
              B.append(temp)
              temp = [value]
              continue
          temp.append(value)
      B.append(temp)
      

      代码的工作原理:

      • Enumerate 获取一个列表并将其转换为元组格式。
        所以 enumerate 会让你的列表看起来像这样:
        (0, 0) (1, 1) (2, 2) (3, 6) (4, 7) 等等......
      • index != 0 条件确保您不会在 if 语句的下一部分中访问 0 之前的元素。 IE。 A[index-1],如果索引为 0,那么这将是 A[0-1] = A[-1] = NOT what we want(因为这将给出最后一个元素)
      • temp = [value] 创建一个新列表。 IE。下一个要附加到 B 中的列表。
      • continue 回到 for 循环,为特定的迭代跳过它下面的任何代码。

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的附加上下文可提高其长期价值.
      • @Swier 谢谢。好点子。我现在添加了一个解释。
      【解决方案4】:

      我认为一种优雅且更快的方法是使用itertools.groupby,例如:

      from itertools import groupby
      from operator import itemgetter
      
      A=[0,1,2,6,7,8,9,14,15,16]
      B = [list(map(itemgetter(1), group)) for key, group in groupby(enumerate(A), lambda x: x[0] - x[1])]
      

      【讨论】:

      • 这对于上面提到的具体例子来说是好的,但是如果条件改变为间隔需要3来开始一个新的组,它就不起作用了。
      【解决方案5】:
      A = [0, 1, 2, 6, 7, 8, 9, 14, 15, 17]
      
      B = []
      start = 0
      end = 0
      for i, val in enumerate(A):
          if i != 0 and val - A[i-1] >= 2:
              B.append(A[start:end])
              start = end
          end += 1
      B.append(A[start:end])
      

      【讨论】:

        猜你喜欢
        • 2020-12-29
        • 1970-01-01
        • 2020-03-11
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 2019-09-12
        • 2013-04-07
        • 2019-02-05
        相关资源
        最近更新 更多