【问题标题】:Slicing a list at integer of when an element is different from the previous在元素与前一个元素不同时以整数切片列表
【发布时间】:2019-07-31 18:34:59
【问题描述】:

我需要能够将一个点列表分割成多个子列表,作为分割另一个列表的指南。

a = 1 # just an example
b = 2 # just an example
c = 3 # just an example

# My list right now 
y_vals = [a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c]

每次数字变化时我都需要它来切片。 abc是实际数字,但数字比较长,所以我在a,b,c打出来了。

我想使用[:x]的切片方法,但它是一个5000多个数字的列表,我不知道如何切片列表。提前谢谢!

【问题讨论】:

    标签: python grasshopper


    【解决方案1】:

    如果您只是想获得仅具有相同编号的子列表,则不必为切片而烦恼。一个好的方法是itertools.groupby:

    from itertools import groupby
    
    li = [3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2]
    
    for _, group in groupby(li):
        print(list(group))
    

    输出

    [3, 3, 3, 3, 3, 3]
    [1, 1, 1, 1, 1]
    [2, 2]
    

    EDIT 从这里获得所需的列表是一个简单的单行:

    output = [list(group) for _, group in groupby(li)]
    print(output)
    

    输出

    [[3, 3, 3, 3, 3, 3], [1, 1, 1, 1, 1], [2, 2]]
    

    【讨论】:

    • 漂亮的解决方案!
    • this 和 pyQueen 的回答都为我提供了一个非常漂亮的 python 解决方案,可以单独获取所有潜在的子列表,但我想我并不清楚我需要最终结果是单个子列表列表,因此是蚱蜢的标签,因为蚱蜢环境将子列表列表识别为“树数据”,这是我需要的...>.
    【解决方案2】:

    这个算法不是很漂亮,但它应该可以工作:

    a = 1
    b = 2
    c = 3
    
    y_vals = [a,a,a,a,a,a,b,b,b,b,c,c,c,c,c]
    
    last_break = 0
    for i in range(1, len(y_vals)):
        if y_vals[i - 1] != y_vals[i]:
            print(y_vals[last_break: i])
            last_break = i
        if i == len(y_vals) - 1:
            print(y_vals[last_break: i + 1])
    

    结果:

    [1, 1, 1, 1, 1, 1]
    [2, 2, 2, 2]
    [3, 3, 3, 3, 3]
    

    编辑:它也适用于这样的列表:

    y_vals = [1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,1,1,1]

    @GotCubes 的算法不会。

    【讨论】:

      【解决方案3】:

      无需切片的解决方案:

      y_vals = [1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,1,1,1]
      sub_list = []
      
      for i in range(0, len(y_vals)):
          if ((i < len(y_vals)-1 ) and (y_vals[i] == y_vals[i+1])):
              sub_list.append(y_vals[i])
          else:
              sub_list.append(y_vals[i])
              print(sub_list)
              sub_list=[]
      

      输出:

      [1, 1, 1, 1, 1, 1]
      [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
      [3, 3, 3, 3, 3]
      [1, 1, 1]
      

      【讨论】:

        【解决方案4】:

        @DeepSpace 有您最有可能寻找的答案。但是,如果您坚持切片,或者以其他方式获取要切片的索引,这可能会有所帮助:

        # Six 1's, Eleven 2's, Five 3's
        y_vals = [1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3]
        
        split_points = [y_vals.count(v) for v in set(y_vals)]
        print(split_points)
        
        ind = 0
        for i in split_points:
            segment = y_vals[ind:ind+i]
            ind = ind + i
            print(segment)
        

        这给了你:

        [6, 11, 5]
        [1, 1, 1, 1, 1, 1]
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
        [3, 3, 3, 3, 3]
        

        【讨论】:

        • 这只有在没有重复值的情况下才有效,OP说他想在每次数字变化时切片。
        • 啊,你是对的。我做了一个(当然是错误的)假设,即通过更改数字,它不会回到以前的值。我想这取决于数据的组织方式。谢谢你的收获!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 2018-09-27
        • 1970-01-01
        • 2014-05-21
        • 2020-05-13
        • 2017-01-15
        相关资源
        最近更新 更多