Разбиение списка списков на несколько
Даны два списка
a=[
[1,12,13,15,160,170,200],
[1,12,13,15,160,170,200]
]
и
b=[
[3,20,200],
[5,50,250]
].
Необходимо разбить первый список на группы из второго списка по принципу
[
[
[1],
[12,13,15],
[160,170,200]
],
[
[1],
[12,13,15],
[160,170,200]
]
].
Т.е. числа из первого списка, должны попадать в интервалы из второго.
Ответы (2 шт):
Автор решения: splash58
→ Ссылка
a=[
[1,12,13,15,160,170,200],
[1,12,13,15,160,170,200]
]
b=[
[3,20,200],
[5,50,250]
]
result = []
for x,c in zip(a,b):
res = [[]]
while x and c:
if x[0] <= c[0]:
res[-1].append(x.pop(0))
else:
c.pop(0)
res.append([])
result.append(res)
print(result)
[
[[1], [12, 13, 15], [160, 170, 200]],
[[1], [12, 13, 15], [160, 170, 200]]
]
Автор решения: MaxU
→ Ссылка
Можно воспользоваться модулем Pandas:
import numpy as np
import pandas as pd
def hist(arr, bins):
arr = pd.Series(arr)
bins = [-np.inf] + list(bins)
res = arr.groupby(pd.cut(arr, bins=bins)).apply(list)
return res
примеры:
In [139]: hist(a[0], b[0])
Out[139]:
(-inf, 3.0] [1]
(3.0, 20.0] [12, 13, 15]
(20.0, 200.0] [160, 170, 200]
dtype: object
In [140]: hist(a[1], b[1])
Out[140]:
(-inf, 5.0] [1]
(5.0, 50.0] [12, 13, 15]
(50.0, 250.0] [160, 170, 200]
dtype: object
результаты в виде списка:
In [141]: list(hist(a[1], b[1]))
Out[141]: [[1], [12, 13, 15], [160, 170, 200]]
In [142]: [list(hist(i,j)) for i,j in zip(a,b)]
Out[142]: [[[1], [12, 13, 15], [160, 170, 200]], [[1], [12, 13, 15], [160, 170, 200]]]