У меня есть список целых чисел, в которых некоторые являются последовательными числами.

Что я имею:

myIntList = [21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7] и т. Д.

Что я хочу:

MyNewIntList = [[21,22,23,24],[0,1,2,3],[0,1,2,3,4,5,6,7]]

Я хочу иметь возможность разделить этот список по элементу 0, то есть при цикле, если элемент равен 0, чтобы разделить список на отдельные списки. Затем, после разделения myIntList любого количества раз (на основе повторений нахождения элемента 0), я хочу добавить каждое «разбиение» или группу последовательных целых чисел в список в списке.

Также я мог бы сделать то же самое с «списком строк» вместо целых чисел? (Разделить основной список строк на более мелкие списки на основе повторяющегося элемента)

РЕДАКТИРОВАТЬ:

Как бы я разделить список по последовательным номерам? В моем списке есть часть, где она переходит с 322 на 51, между ними нет 0. Я хочу разделить:

[[...319,320,321,322,51,52,53...]]

В

[[...319,320,321,322],[51,52,53...]]

Как разделить элементы в списке по порядковым номерам?

Опубликовано здесь: Разделить список списков (целых чисел) по порядку в отдельный списки

7
Mike Issa 14 Дек 2015 в 18:48

6 ответов

Лучший ответ
it  = iter(myIntList)
out = [[next(it)]]
for ele in it:
    if ele != 0:
        out[-1].append(ele)
    else:
        out.append([ele])

print(out)

Или в функции:

def split_at(i, l):
    it = iter(l)
    out = [next(it)]
    for ele in it:
        if ele != i:
            out.append(ele)
        else:
            yield out
            out = [ele]
    yield out

Он поймает, если у вас есть 0 в начале:

In [89]: list(split_at(0, myIntList))
Out[89]: [[21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]

In [90]: myIntList = [0,21, 22, 23, 24, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7]

In [91]: list(split_at(0, myIntList))
Out[91]: [[0, 21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]
4
Padraic Cunningham 14 Дек 2015 в 16:43

(Я смутно подозреваю, что делал это раньше, но сейчас не могу найти.)

from itertools import groupby, accumulate

def itergroup(seq, val):
    it = iter(seq)    
    grouped = groupby(accumulate(x==val for x in seq))
    return [[next(it) for c in g] for k,g in grouped]

Дает

>>> itergroup([21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7], 0)
[[21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]
>>> itergroup([0,1,2,0,3,4], 0)
[[0, 1, 2], [0, 3, 4]]
>>> itergroup([0,0], 0)
[[0], [0]]

(Тем не менее, на практике я использую yield версию того же цикла / ветки, что и все остальные, но я опубликую выше для разнообразия.)

3
DSM 14 Дек 2015 в 16:31

Вы можете использовать нарезку:

myIntList = [21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7]
myNewIntList = []
lastIndex = 0
for i in range(len(myIntList)):
    if myIntList[i] == 0:
        myNewIntList.append(myIntList[lastIndex:i])
        lastIndex = i

myNewIntList.append(myIntList[lastIndex:])
print(myNewIntList)
# [[21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]

Вы можете разделить строки, используя функцию str.split:

s = 'stackoverflow'
s.split('o') # ['stack', 'verfl', 'w'] (removes the 'o's)

import re
[part for part in re.split('(o[^o]*)', s) if part] # ['stack', 'overfl', 'ow'] (keeps the 'o's)
2
Fernando Matsumoto 14 Дек 2015 в 16:13

Вы можете попробовать:

i = 0
j = 0
loop = True
newList = []

while loop:
    try:
        i = myIntList.index(0, j)
        newList.append(myIntList[j:i])
        j = i + 1
    except ValueError as e:
        newList.append(myIntList[j:])
        loop = False

print newList
[[21, 22, 23, 24], [1, 2, 3], [1, 2, 3, 4, 5, 6, 7]]
-3
Mike P 14 Дек 2015 в 16:10
myIntList = [21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7]

new = []
m,j=0,0
for i in range(myIntList.count(0)+1):
    try:
        j= j+myIntList[j:].index(0)
        if m==j:
           j= j+myIntList[j+1:].index(0)+1



        new.append(myIntList[m:j])
        m,j=j,m+j
    except:
        new.append(myIntList[m:])
        break
print new

вывод

 [[21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]

< Сильный > output2

myIntList = [0,21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7]

[[0, 21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]
1
Ravichandra 14 Дек 2015 в 16:56

Вы можете перебирать весь список, добавляя его во временный список до тех пор, пока не будет найдено 0. Затем вы снова сбрасываете временный список и продолжаете.

>>> myIntList = [21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7]
>>> newlist = [] 
>>> templist = []
>>> for i in myIntList:
...      if i==0:
...          newlist.append(templist)
...          templist = []
...      templist.append(i)
... 
>>> newlist.append(templist)
>>> newlist
[[21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]

И для строк вы можете использовать тот же подход, используя вызов list

>>> s = "winterbash"
>>> list(s)
['w', 'i', 'n', 't', 'e', 'r', 'b', 'a', 's', 'h']

Также используется itertools

>>> import itertools
>>> myIntList = [21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7]
>>> temp=[list(g) for k,g in itertools.groupby(myIntList,lambda x:x== 0) if not k]
>>> if myIntList[0]!=0:
...     newlist = [temp[0]] + [[0]+i for i in temp[1:]]
... else:
...     newlist = [[0]+i for i in temp]
... 
>>> newlist
[[21, 22, 23, 24], [0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]]
0
Bhargav Rao 14 Дек 2015 в 16:22