# Comparing two lists and printing the list in Python

## Question:

I have two lists `Z1`

and `Z2`

. I am comparing these two lists and if at least one sublist of `Z1`

appears in `Z2`

, I want to print full `Z1`

. I present the current and expected output.

```
Z1=[[0, 4], [0, 5], [4, 5]]
Z2=[[6, 5], [4, 9], [4, 8], [5, 3], [0,4]]
for i in range(0,len(Z1)):
if (Z1[i]==Z2[i]):
print("Z1 =",Z1)
```

The current output is

```
(Blank)
```

The expected output is

```
Z1=[[0, 4], [0, 5], [4, 5]]
```

## Answers:

You are not looking over all of `Z2`

at most you arrive at `i=2`

so you never arrive at the last item in `Z2`

which is the one you are looking for (which should be `i=4`

, but `len(Z1) < 4`

).

Just loop over both, brute force solution:

```
>>> for z1 in Z1:
... for z2 in Z2:
... if z1 == z2:
... print("Z1 =",Z1)
... break
...
Z1 = [[0, 4], [0, 5], [4, 5]]
```

An rather elegant solution can be using sets and their intersection:

```
Z1=[[0, 4], [0, 5], [4, 5]]
Z2=[[6, 5], [4, 9], [4, 8], [5, 3], [0,4]]
zs1 = set(map(tuple, Z1))
zs2 = set(map(tuple, Z2))
if (zs1 & zs2):
print("Z1 =",Z1)
```

Sets are faster (see Michael’s answer) but the any() function with a comprehension can check the condition in a simple (albeit naive) way:

```
if any(z in Z1 for z in Z2):
print("Z1 =",Z1)
```

You could also benefit from set performance by converting Z1 to a set beforehand. Any() will stop iterating as soon as a match is found so your process will not always convert all Z2 values to tuples (when there is a match).

```
S1 = set(map(tuple,Z1))
if any(tuple(z) in S1 for z in Z2):
print("Z1 =",Z1)
```

With a set, the disjoint method can perform the same thing as any() but with an inverse condition:

```
S1 = set(map(tuple,Z1))
if not S1.isdisjoint(map(tuple,Z2)):
print("Z1 =",Z1)
```