Python 将具有连续块项但不连续块的列表拆分为子列表

Python 将具有连续块项但不连续块的列表拆分为子列表,python,algorithm,sorting,Python,Algorithm,Sorting,假设我有这样一个列表: sublist_1 = [2,3,4] sublist_2 = [7,8,9] sublist_3 = [0,1,2,3] sublist_4 = [10,11,12] sublist_5 = [20,19,18,17] sublist_5 = [17,18,19,20,21] mylist=[2,3,4,7,8,9,0,1,2,3,10,11,12,20,19,18,17,17,18,19,20,21] 我想将其拆分为如下子列表: sublist_1 = [2,3,4

假设我有这样一个列表:

sublist_1 = [2,3,4]
sublist_2 = [7,8,9]
sublist_3 = [0,1,2,3]
sublist_4 = [10,11,12]
sublist_5 = [20,19,18,17]
sublist_5 = [17,18,19,20,21]
mylist=[2,3,4,7,8,9,0,1,2,3,10,11,12,20,19,18,17,17,18,19,20,21]

我想将其拆分为如下子列表:

sublist_1 = [2,3,4]
sublist_2 = [7,8,9]
sublist_3 = [0,1,2,3]
sublist_4 = [10,11,12]
sublist_5 = [20,19,18,17]
sublist_5 = [17,18,19,20,21]
我该怎么做?

代码-

mylist = [2, 3, 4, 7, 8, 9, 0, 1, 2, 3, 10, 11, 12, 20, 19, 18, 17, 17, 18, 19,
          20, 21]

result = []

temp_list = [mylist[0]]

for i in range(1, len(mylist)):
    if abs(mylist[i] - mylist[i - 1]) != 1:
        result.append(temp_list)
        temp_list = [mylist[i]]
    else:
        temp_list.append(mylist[i])

if temp_list:
    result.append(temp_list)

print(result)
输出-

[[2, 3, 4], [7, 8, 9], [0, 1, 2, 3], [10, 11, 12], [20, 19, 18, 17],
 [17, 18, 19, 20, 21]]
这样就可以了

mylist = [2,3,4,7,8,9,0,1,2,3,10,11,12,20,19,18,17,17,18,19,20,21]

index =0
for i in range(0, len(mylist)):
    #print (mylist[i+1])
    if (i+1 >= len(mylist)):
        print (mylist[index:i+1])
        break

    if not( (mylist[i+1] - mylist[i] == 1) or (mylist[i+1] - mylist[i] == -1) ):
        print (mylist[index:i+1])
        index = i+1
输出

[2, 3, 4]
[7, 8, 9]
[0, 1, 2, 3]
[10, 11, 12]
[20, 19, 18, 17]
[17, 18, 19, 20, 21]

这是
numpy
方法。我在用, ,

如果希望输出为
list
而不是
numpy数组
,请将最后一行更改为
rslt=[x.tolist()表示np.split(a,i+1)]
,结果将是

rslt
Out[9]: 
[[2, 3, 4],
 [7, 8, 9],
 [0, 1, 2, 3],
 [10, 11, 12],
 [20, 19, 18, 17],
 [17, 18, 19, 20, 21]]

您应该避免使许多变量只相差一个下标。在许多情况下,最好将它们全部添加到列表中,然后使用列表索引来获取所需的子列表:
子列表=[[2,3,4],[7,8,9],…,[17,18,19,20,21]
。然后,如果您想打印第二个子列表(注意Python使用基于0的索引),您可以执行
print(子列表[1])
。如果
mylist=[1,2,3,4,3,2,1]
,那么预期的答案是什么?那是
[1,2,3,4];[3,2,1]
[1,2,3];[4,3,2,1]
[1,2,3,4,3,2,1]
?@BasSwinckels谢谢你提醒我,在你提到之前我没有认出那个案子。这个问题源于我的通信网络,如果数据包序列在线路中丢失,接收到的数据包将像这样中断
[20,21,23,29,30,31,0,1]
。我将其扩展到更一般的情况,并尝试找出解决方案