I have a list of integers, in which some are consecutive numbers.
What I have:
myIntList = [21,22,23,24,0,1,2,3,0,1,2,3,4,5,6,7]
etc...
What I want:
MyNewIntList = [[21,22,23,24],[0,1,2,3],[0,1,2,3,4,5,6,7]]
I want to be able to split this list by the element 0, ie when looping, if the element is 0, to split the list into separate lists. Then, after splitting myIntList
whatever number of times (based on the recurrences of finding the element 0), I want to append each 'split' or group of consecutive integers into a list within a list.
Also would I be able to do the same sort of thing with a 'list of strings' instead of integers? (Split the main string list into smaller lists based on a reoccurring element)
EDIT:
How would I go about splitting the list by consecutive numbers? There's a part in my list where it jumps from 322 to 51, there is no 0 in between. I want to split:
[[...319,320,321,322,51,52,53...]]
into
[[...319,320,321,322],[51,52,53...]]
basically, how do I split elements in a list by consecutive numbers?
Posted here: Split list of lists (integers) by consecutive order into separate lists
it = iter(myIntList)
out = [[next(it)]]
for ele in it:
if ele != 0:
out[-1].append(ele)
else:
out.append([ele])
print(out)
Or in a function:
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
It will catch if you have a 0
at the start:
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]]
(I vaguely suspect I've done this before but I can't find it now.)
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]
gives
>>> 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]]
(That said, in practice I use the yield
version of the same loop/branch that everyone else does, but I'll post the above for variety.)
You can use slicing:
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]]
You can split strings using the str.split
function:
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)
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
output
[[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]]
You can loop through the whole list, appending to a temp list till 0
is found. Then you again reset the temp list and continue.
>>> 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]]
and for strings you can use the same approach by using the list
call
>>> s = "winterbash"
>>> list(s)
['w', 'i', 'n', 't', 'e', 'r', 'b', 'a', 's', 'h']
Also using 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]]
You could try:
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]]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.