在元素与先前元素不同的整数处切片列表

时间:2019-07-31 18:34:59

标签: python grasshopper

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

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个数字的列表,并且我不确定如何对列表进行切片。预先谢谢你!

4 个答案:

答案 0 :(得分:2)

如果您只想获得仅具有相同编号的子列表,则不必理会切片。一个不错的方法是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 (从

EDIT )到列表的所需列表很简单:

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

输出

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

答案 1 :(得分:1)

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

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的算法不会。

答案 2 :(得分:0)

不切片的解决方案:

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]

答案 3 :(得分:-2)

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