Как я могу разделить список на список списков, основываясь на разнице между соседними элементами? - PullRequest
2 голосов
/ 28 марта 2019

Например, если у меня есть

MAX_ALLOWED_DIFF = 3
nums=[1, 2, 4, 10, 13, 2, 5, 5, 5]

, вывод должен быть

groups = [[1, 2, 4], [10, 13], [2, 5, 5, 5]]

Контекст: у меня было pandas.Series object nums, и я использовал

nums = nums.diff().gt(DETECTION_MAX_DIFF_NS).cumsum()).apply(list).tolist()

для подвыборки таким же образом, но я заметил, что в моем Series nums много дубликатов, и после использования метода .unique() у меня больше нет объекта Series, у меня есть numpy.ndarray (1D) вместо этого.

Я полагаю, что могу использовать что-то вроде pandas.Series(nums.unique), но мне не нравится этот хак.

Ответы [ 3 ]

3 голосов
/ 28 марта 2019

Итак, мы используем drop_duplicates, сохраняем nums, оставайтесь в pd.Series

nums=nums.drop_duplicates()
nums.groupby(nums.diff().abs().gt(MAX_ALLOWED_DIFF).cumsum()).apply(list).tolist()
Out[447]: [[1, 2, 4], [10, 13], [5]]
3 голосов
/ 28 марта 2019

Вот один подход -

>>> import numpy as np
>>> idx = np.r_[0,np.flatnonzero(np.abs(np.diff(nums))>MAX_ALLOWED_DIFF)+1,len(nums)]
>>> [nums[i:j] for (i,j) in zip(idx[:-1],idx[1:])]
[[1, 2, 4], [10, 13], [2, 5, 5, 5]]
2 голосов
/ 28 марта 2019

Учитывая, что вы тоже пометили numpy, вот один из способов сделать это:

thr = 3
ix = np.flatnonzero(np.concatenate([[False], np.abs(np.diff(nums))>thr]))
np.split(nums, ix)

Вывод

[array([1, 2, 4]), array([10, 13]), array([2, 5, 5, 5])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...