Althea C
Althea C

Reputation: 109

Removing list of list if any item in list of list is zero

I have a list of list where the sublist contains numbers that are either 0, 1 or 2. I need to remove any sublist where any of the numbers are 0.

I tried this code:

l = [list(b) for b in x.Branches]
z = 0
list2 = filter(z, l)
print list2

But it keeps telling me that int is not iterable. the first line gets me my list from rhino grasshopper data, and my list is

[[1, 1, 2, 0], [0, 2, 2, 0], [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 0], [0, 2, 2, 0], [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 0], [0, 2, 2, 0], [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 0], [0, 2, 2, 0], [0, 2, 0, 0], [0, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 0], [0, 2, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 0, 2], [2, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 0, 2], [2, 0, 0, 2], [2, 0, 0, 0], [0, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 0, 2], [2, 0, 0, 2], [2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 2, 2], [2, 2, 2, 2], [2, 2, 0, 2], [2, 0, 0, 2], [2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 0, 2], [2, 0, 0, 2], [2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Upvotes: 0

Views: 300

Answers (3)

GZ0
GZ0

Reputation: 4273

Another approach to accomplish the same task is this:

list_2 = list(filter(all, l))

Here, the all function evaluates to true if every element being evaluated is true. Since bool(x) is true for all non-zero values, all(l) is true if all values in l are non-zero.

Upvotes: 0

hilberts_drinking_problem
hilberts_drinking_problem

Reputation: 11602

To remove lists containing at least one zero, you could use

res = [ls for ls in lst if 0 not in ls]

Here is a hacky way of removing all suslists consisting only of zeros, assuming all elements are non-negative:

res = filter(sum, lst)

This uses the fact that bool(0) == False and bool(x) == True for x > 0.

Upvotes: 1

Peter Deng
Peter Deng

Reputation: 36

filter takes function as first argument, I actually got TypeError. That's because 0 is not a function and it is not callable.

In [49]: list(filter(0, l))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-49-fe89c490c585> in <module>
----> 1 list(filter(0, l))

TypeError: 'int' object is not callable

the way I tried is below, hope it helps

In [50]: is_zero = lambda x: x == 0

In [51]: is_all_zero = lambda x: all(map(is_zero, x))

In [52]: not_is_all_zero = lambda x: not is_all_zero(x)
  • is_zero checks if x is zero
  • is_all_zero checks if list is all zero
  • not_is_all_zero get opposite output of is_all_zero

and now we can use not_is_all_zero to filter l

In [54]: list(filter(not_is_all_zero, l))
Out[54]:
[[1, 1, 2, 0],
 [0, 2, 2, 0],
 [0, 2, 0, 0],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 0],
 [0, 2, 2, 0],
 [0, 2, 0, 0],
 [1, 1, 2, 2],
...

Update

you want filter any of item is zero, so you can apply below function to filter the list

In [55]: is_any_zero = lambda x: any(map(is_zero, x))

In [56]: is_any_zero([0,1])
Out[56]: True

In [57]: is_any_zero([1,1])
Out[57]: False

In [59]: not_is_any_zero = lambda x: not is_any_zero(x)

In [60]: list(filter(not_is_any_zero, l))
Out[60]:
[[1, 1, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [2, 2, 2, 2],
 [1, 1, 2, 2],
 [2, 2, 2, 2]]

Upvotes: 1

Related Questions