У меня есть список целых чисел, в которых некоторые являются последовательными числами.
Что я имею:
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...]]
Как разделить элементы в списке по порядковым номерам?
Опубликовано здесь: Разделить список списков (целых чисел) по порядку в отдельный списки
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]]
(Я смутно подозреваю, что делал это раньше, но сейчас не могу найти.)
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
версию того же цикла / ветки, что и все остальные, но я опубликую выше для разнообразия.)
Вы можете использовать нарезку:
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)
Вы можете попробовать:
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]]
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]]
Вы можете перебирать весь список, добавляя его во временный список до тех пор, пока не будет найдено 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]]
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.