1

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

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]

每次数字变化时我都需要它来切片。a,bc是实际数字,但是数字比较长,所以我输入了a,b,c.

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

4

4 回答 4

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]

编辑 从此到您所需的列表列表是一个简单的单行:

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

输出

[[3, 3, 3, 3, 3, 3], [1, 1, 1, 1, 1], [2, 2]]
于 2019-07-31T18:41:18.443 回答
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 的算法不会。

于 2019-07-31T18:53:46.127 回答
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]
于 2019-07-31T20:30:51.773 回答
-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]
于 2019-07-31T18:53:30.747 回答