4

I have two lists A1 and J1 containing many sublists. From each sublist of A1[0], I want to remove the element specified in J1[0]. I present the current and expected outputs.

A1 = [[[1, 3, 4, 6], [0, 2, 3, 5]], [[1, 3, 4, 6], [1, 3, 4, 6]]]

J1 = [[[1], [2]], [[1], [4]]]

arD = []


for i in range(0,len(A1)):
    for j in range(0,len(J1)):
        C=set(A1[i][j])-set(J1[i][j])
        D=list(C)
        arD.append(D)
        D=list(arD)
print("D =",D)

The current output is

D = [[3, 4, 6], [0, 3, 5], [3, 4, 6], [1, 3, 6]]

The expected output is

D = [[[3, 4, 6], [0, 3, 5]],[[3, 4, 6],[1, 3, 6]]]

5 Answers 5

2

Code:-

A1 = [[[1, 3, 4, 6], [0, 2, 3, 5]], [[1, 3, 4, 6], [1, 3, 4, 6]]]

J1 = [[[1], [2]], [[1], [4]]]

arD=[]

for i in range(0,len(A1)):
    tmp=[]                 #Created a tmp variable list
    for j in range(0,len(J1)):
        C=set(A1[i][j])-set(J1[i][j])
        tmp.append(list(C))    #Appending result in tmp variable
    arD.append(tmp)            #Storing tmp list as a list of lists in arD.
print("D =",arD)

Output:-

D = [[[3, 4, 6], [0, 3, 5]], [[3, 4, 6], [1, 3, 6]]]
Sign up to request clarification or add additional context in comments.

Comments

1

Use list comprehension:

print([[[num for num in subsub_A1 if num not in subsub_J1]
        for subsub_A1, subsub_J1 in zip(sub_A1, sub_J1)]
       for sub_A1, sub_J1 in zip(A1, J1)])

Output:

[[[3, 4, 6], [0, 3, 5]], [[3, 4, 6], [1, 3, 6]]]

Comments

1

If you have an arbitrary list depth, consider using a recursive function:

def cleanup(A, J):
    for l1, l2 in zip(A, J):
        if l1 and isinstance(l1[0], list):
            cleanup(l1, l2)
        else:
            s = set(l2)
            l1[:] = [x for x in l1 if x not in s]

cleanup(A1, J1) # operation is in place
print(A1)

Output: [[[3, 4, 6], [0, 3, 5]], [[3, 4, 6], [1, 3, 6]]]

Comments

1

Try using remove method if you don't mind corrupting the original data:

from contextlib import suppress

A1 = [[[1, 3, 4, 6], [0, 2, 3, 5]], [[1, 3, 4, 6], [1, 3, 4, 6]]]
J1 = [[[1], [2]], [[1], [4]]]

for A, J in zip(A1, J1):
    for a, j in zip(A, J):
        for x in j:
            with suppress(ValueError):
                a.remove(x)
print(f"RESULT: {A1}")

output: RESULT: [[[3, 4, 6], [0, 3, 5]], [[3, 4, 6], [1, 3, 6]]]

Comments

0

Using list comprehension

[[list(set(A1[i][j])-set(J1[i][j])) for j in range(0,len(J1))] for i in range(0,len(A1))]

#output

[[[3, 4, 6], [0, 3, 5]], [[3, 4, 6], [1, 3, 6]]]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.