выбрать подмассивы, разделенные нулями в python

Учитывая список вроде:

A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]

есть ли простой способ создать подмассивы с теми элементами, которые разделены нулями (или, по крайней мере, NaN)? Я имею в виду, например:

A1 = [18, 7]
A2 = [9, 12]
A3 = [11, 2, 3, 3]
A4 = [7, 8]

Я написал:

q=0
for i in range(0,len(A)):
    if A[i]-A[i-1] < 1:
        q=q+1

для получения количества нулевых пакетов, присутствующих в списке. Но мне нужно заполнить подмассивы, пока я встречаю их в списке... может быть, что-то с функцией split? Заранее спасибо.


person urgeo    schedule 01.08.2016    source источник
comment
Конечно, есть способ, вы пробовали что-нибудь? Покажите нам свой код, пожалуйста.   -  person Julien    schedule 01.08.2016
comment
Возможный дубликат: stackoverflow.com/questions/4322705/   -  person Yotam Salmon    schedule 01.08.2016


Ответы (3)


У itertools есть решение для вас: groupby(list, filter).

Если вы хотите сгруппировать по нулям, начните с выполнения:

B = itertools.groupby(A, lambda x:x == 0)

Лямбда-выражение «решает», какое из значений должно быть разделителем. Вы можете разделить на Nones, используя lambda x: x == None (например). Это вернет вам итерируемый объект. Итак, используя понимание списка, давайте пройдемся по нему (каждая итерация дает нам кортеж из 2 значений):

C = [(i, list(j)) for i, j in B] # j is cast to a list because it's originally an object, not a list.

Вывод будет примерно таким:

[(False, [18, 7]), (True, [0]), (True, [0]), (True, [0]), ... ]

Теперь каждый список j, который является разделителем, имеет значение True для i. Итак, мы можем отфильтровать его:

C = [list(j) for i, j in B if not i]

Теперь результатом является 2d-список:

[[18, 7], [9, 12], [11, 2, 3, 3], [7, 8]]

Итак, функция с одним вкладышем:

def splitArr():
    return [list(j) for i, j in itertools.groupby(A, lambda x:x == 0) if not i]
person Yotam Salmon    schedule 01.08.2016
comment
Благодарю вас! Это то, что я искал - person urgeo; 01.08.2016
comment
@urgeo Добро пожаловать! Надеюсь, вы прочитали все, а не только окончательное решение ;-) - person Yotam Salmon; 01.08.2016

Попробуй это:

import itertools as it
A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]

[list(v) for k, v in it.groupby(A, lambda x: not x) if not k]
=> [[18, 7], [9, 12], [11, 2, 3, 3], [7, 8]]
person Óscar López    schedule 01.08.2016

наивное решение:

A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]
b = []
c = []
for i in A:
    if i == 0:
        if len(c):
            b.append(c)
        c = []
        continue
    c.append(i)
if len(c):
    b.append(c)
person Aviad Levy    schedule 01.08.2016