我需要能够将点列表切成多个子列表,以作为切片另一个列表的指南。
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
,b
和c
是实际数字,但是数字相当长,因此我在a,b,c
中输入了数字。
我想使用[:x]
的切片方法,但这是5000个数字的列表,并且我不确定如何对列表进行切片。预先谢谢你!
答案 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]