Elements corresponding to conditions in a sublist in Python

Question:

I have lists J and cond1. I want to print the values in J corresponding to False in each sublist of cond1. I present the current and expected outputs.

J=[[1, 2, 4, 6, 7], [1, 4]]
cond1=[[[False, True, False, True, False]], [[False, True]]]

result = [value for value, condition in zip(J, cond1) if not condition]
print(result)

The current output is

[]

The expected output is

[[1,4, 7],[1]]
Asked By: AEinstein

||

Answers:

try a old but gold for loop. there might be more elegant solutions, but if the two lists are small, it can be totally fine ..

J = [[1, 2, 4, 6, 7], [1, 4]]
cond1 = [[[False, True, False, True, False]], [[False, True]]]

for j, c in zip(J, cond1):
    values = [x for x, y in zip(j, c[0]) if not y]
    print(values)

this returns

[1, 4, 7]
[1]

The expected result from the user cannot be correct, element ‘7’ is False as well. Am I missing something ?

Answered By: Lorenzo Bassetti

The problem is that the lists in cond1 are nested inside another list, whereas in J they are at the top level. This is what’s causing the confusion.
If you were to fix the nesting everything works, as seen here:

J=[[1, 2, 4, 6, 7], [1, 4]]
cond1=[[False, True, False, True, False], [False, True]]
# note that J and cond1 have the same nesting level here

def retain_false(numbers, booleans):
    return [num for num, boolean in zip(numbers, booleans) if not boolean]

for numbers, booleans in zip(J, cond1):
    print(retain_false(numbers, booleans))

## output
[1, 4, 7]
[1]

If, for some reason, you don’t want to handle the nesting issue, then just access the first index of booleans:

for numbers, booleans in zip(J, cond1):
    print(retain_false(numbers, booleans[0]))
Answered By: Tomer Ariel

According your question, the expected output should to be [[1,4,7],[1]]

This match your requirement:

J=[[1, 2, 4, 6, 7], [1, 4]]
cond1=[[[False, True, False, True, False]], [[False, True]]]

values = [[x for x, y in zip(j, c[0]) if not y] for j, c in zip(J, cond1)]
print(values)
Answered By: Michaël Silvestre
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.