У вас нет быстрого ответа на первую часть вашего вопроса, и lenik уже предлагает хорошее решение на основе zip
, но SplitBy
можно легко воспроизвести с помощью функции groupby
itertools
модуль ( документ здесь ).
Осторожно, groupby
будет вставлять разделитель (~ создавать новую группу) каждый раз при смене ключа. Поэтому, если вы хотите что-то вроде SplitBy
, вам нужно сначала отсортировать его по ключевой функции.
В конце это даст вам что-то вроде этого:
>>> def split_by(l, func):
groups = []
sorted_l = sorted(l, key=func)
for _, g in it.groupby(sorted_l, key=func):
groups.append(list(g))
return groups
>>> split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)
[[2], [3, 5, 7, 11, 13, 17, 19, 23, 29]]
Oneверсия с использованием списка:
splited_by = [list(g) for _, g in it.groupby(sorted(l, key=func), key=func)]
Быстрый тест timeit на моем старом и сломанном ноутбуке:
>>> %timeit split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)
8.42 µs ± 92.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
>>> %timeit split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)
10.8 µs ± 53.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
>>> %timeit split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)
12.6 µs ± 162 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)