问题
I have the following list:
indices_to_remove: [0,1,2,3,..,600,800,801,802,....,1200,1600,1601,1602,...,1800]
I have basically 3 subsets of consecutive indices:
- 0-600
- 800-1200
- 1600-1800
I would like to create 3 different small lists that will include only consecutive numbers.
Expected outcome:
indices_to_remove_1 : [0,1,2,3,....,600]
indices_to_remove_2 : [800,801,802,....,1200]
indices_to_remove_3 : [1600,1601,1602,....., 1800]
P.S: The numbers are arbitrary and random; moreover, I may encounter more than 3 subsets or less.
回答1:
Another way is using more_itertools.consecutive_groups: (used @Stephen's list for an example):
import more_itertools as mit
for group in mit.consecutive_groups(indices_to_remove):
print(list(group))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]
[160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170]
回答2:
I like to use generators for this sort of problem. You can do this like:
Split Non-Consecutive Data:
def split_non_consequtive(data):
data = iter(data)
val = next(data)
chunk = []
try:
while True:
chunk.append(val)
val = next(data)
if val != chunk[-1] + 1:
yield chunk
chunk = []
except StopIteration:
if chunk:
yield chunk
Test Code:
indices_to_remove = (
list(range(0, 11)) +
list(range(80, 91)) +
list(range(160, 171))
)
for i in split_non_consequtive(indices_to_remove):
print(i)
Results:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]
[160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170]
回答3:
Without making it complicated, you can simply solve it something like this :
def chunk_lists_(data_):
consecutive_list = []
for chunks in range(len(data_)):
try:
#check consecutiveness
if data_[chunks + 1] - data_[chunks] == 1:
#check if it's already in list
if data_[chunks] not in consecutive_list:
consecutive_list.append(data_[chunks])
#add last one too
consecutive_list.append(data_[chunks + 1])
else:
#yield here and empty list
yield consecutive_list
consecutive_list = []
except Exception:
pass
yield consecutive_list
Test:
#Stephen's list
print(list(chunk_lists_(list(range(0, 11)) +
list(range(80, 91)) +
list(range(160, 171)))))
output:
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170]]
来源:https://stackoverflow.com/questions/55914382/how-to-split-consecutive-elements-in-a-list-into-sublists