Разбиение списка целых чисел на подсписки с заданным 0 в качестве разделителя - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть этот список целых чисел:

l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6]

, и я должен был бы сгенерировать следующий список, разделив приведенный выше список, используя последовательные нули в качестве разделителя, чтобы получить:

res = [[6, 6], [5, 4, 5] , [4, 6]]

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

В Python есть замечательная функция, которую мы можем использовать для нарезки.я думаю, что этот подход проще, чем другой ответ, который использует itertools.groupby.

код:

l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6]
res = list(map(list, zip(l[::2], l[1::2])))
print(res)

результат:

[(6, 6), (0, 5), (4, 5), (0, 0), (4, 6)]

альтернатива с использованием понимания списка вместо встроенной функции карты:

res = [list(i) for i in (zip(l[::2], l[1::2]))] 

объяснение:

Функция zip () принимает итераторы (например, list, string, dict) или определяемые пользователем итерации и возвращает итератор кортежей на основе итерируемого объекта.

the map () функция принимает два аргумента. Первый аргумент - это имя функции, а второй - последовательность (например, список) seq.

map () применяет функцию ко всем элементам последовательности.

мы используем ее здесь, чтобы применить встроенную функцию списка ко всем кортежам, полученным из функции zip.

с помощью нарезки мы даем zip-функции две итерации, сделанные из вашего списка, один начинается с первого элемента с шагом в два, а другой начинается со второго элемента, а также с шагом, равным двум.

объяснение среза, используемого здесь: l [:: 2]

Списки имеют бит по умолчанию функциональности при нарезке.Если перед первым двоеточием нет значения, это означает, что нужно начинать с начального индекса списка.Если после первого двоеточия нет значения, это означает, что необходимо пройти весь путь до конца списка.Это последнее двоеточие говорит Python, что мы хотели бы выбрать наш шаг увеличения.По умолчанию Python устанавливает это приращение равным 1, но это дополнительное двоеточие в конце чисел позволяет нам указать, что мы хотим, чтобы оно было.

учебник по нарезке:

ссылка

Документация по Python-функции:

ссылка

Документы по функциям карты Python:

ссылка

Документы для понимания списка Python:

ссылка

0 голосов
/ 18 февраля 2019

Вы можете использовать itertools.groupby, чтобы сгруппировать элементы в списке, которые появляются между 0s:

from itertools import groupby
[list(v) for k,v in groupby(l, key = lambda x: x != 0) if k != 0]
# [[6, 6], [5, 4, 5], [4, 6]]

Подробности

Аргумент key здесь key = lambda x: x != 0 преобразует список таким образом, чтобы он вместо этого был сгруппирован по:

[x != 0 for x in l]
# [True, True, False, True, True, True, False, False, True, True]

Обратите внимание, что groupby группирует последовательные значения, которые равны.Таким образом, этот ключ будет давать следующие значения в результате groupby:

[list(v) for k,v in groupby(l, key = lambda x: x != 0)]
[[6, 6], [0], [5, 4, 5], [0, 0], [4, 6]]

Теперь нам нужно только указать, что мы хотим сохранить values, если key не 0, что можно сделать, добавив if k != 0 в конце списка понимания.


Полезные чтения:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...