Как применить функцию фильтра к элементам в нескольких списках? - PullRequest
1 голос
/ 20 мая 2019

Я хочу получить значения из нескольких (?) Списков, , который не является 0 (я думаю, filter может быть одним из решений).

список, как показано ниже:

>>ls = [[i for i in np.random.randint(0, 5, 5)] for _ in range(7)]
>>ls
>>
[[2, 3, 3, 0, 0],
 [4, 2, 4, 3, 2],
 [1, 2, 4, 2, 4],
 [2, 3, 4, 3, 1],
 [0, 1, 0, 3, 0],
 [3, 4, 4, 4, 3],
 [3, 4, 3, 3, 2]]

Ожидаемый результат :

[2,3,3,4,2,4,3,2,1,2,4,2,4,2,3,4,3,1,1,3,3,4,4,4,3,3,4,3,3,2]

Я пытался использовать filter function , хотел расширить эту идею, но мне не удалось:

>> [elem for elem in filter(lambda x: x if x != 0 else False, ls[0])]
>> 
[2, 3, 3]

Я хочу найти самый быстрый способ получить ожидаемый результат, не используя for loop.Не могли бы вы предложить какую-нибудь хорошую идею?

Редактировать:

Упс, извините, что сбил вас с толку.Я говорю «не разыскивать цикл» означает, что я хочу использовать списочное понимание вместо for loop, потому что я слышал, что списочное понимание больше, чем for loop.

Ответы [ 2 ]

3 голосов
/ 20 мая 2019

Используйте понимание вложенного списка:

[j for i in ls for j in i if j != 0]

ls = [[i for i in np.random.randint(0, 5, 5)] for _ in range(7)]

[[1, 0, 3, 0, 0],
 [1, 2, 2, 3, 0],
 [1, 1, 1, 4, 3],
 [1, 0, 3, 0, 4],
 [2, 0, 3, 0, 2],
 [1, 0, 4, 4, 0],
 [2, 4, 1, 1, 2]]

[j for i in ls for j in i if j != 0]
# [1, 3, 1, 2, 2, 3, 1, 1, 1, 4, 3, 1, 3, 4, 2, 3, 2, 1, 4, 4, 2, 4, 1, 1, 2]

Если вы хотите избежать какого-либо явного зацикливания, вот опция, использующая itertools.chain и filter:

from itertools import chain

list(filter(lambda x: x != 0, chain(*ls)))
# [1, 3, 1, 2, 2, 3, 1, 1, 1, 4, 3, 1, 3, 4, 2, 3, 2, 1, 4, 4, 2, 4, 1, 1, 2]

Похоже, вы также используете NumPy для создания списка. Обратите внимание, что это было бы намного проще и эффективнее, если использовать np.nonzero:

import numpy as np
a = np.random.randint(0, 5, (7,5))
a[np.nonzero(a)]
# [1, 3, 1, 2, 2, 3, 1, 1, 1, 4, 3, 1, 3, 4, 2, 3, 2, 1, 4, 4, 2, 4, 1, 1, 2]
2 голосов
/ 20 мая 2019

Добавление к ответу @ yatu, так как это 0, вы можете просто сделать if x:

print([x for i in ls for x in i if x])

Или без цикла:

print(np.array(ls).flatten()[np.array(ls).flatten() != 0].tolist())

Оба вывода:

[1, 4, 4, 2, 1, 3, 3, 4, 4, 1, 3, 3, 2, 2, 2, 1, 4, 2, 2, 1, 4, 1, 2, 3, 2, 4]
...