Table of Contents

## Question: Python List Comprehensions [Basic Data Types]

Let’s learn about list comprehension! You are given three integers x, y, and z representing the dimensions of a cuboid along with an integer n. Print a list of all possible coordinates given by (i, j, k) on a 3D grid where the sum of i + j + k is not equal to n. Here, 0 <= i <= x; 0 <= j <= y; 0 <= k <= z. Please use list comprehensions rather than multiple loops, as a learning exercise.

**Example:**

x = 1

y = 1

z = 2

n = 3

All permutations of [i, j, k] are:

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

Print an array of the elements that do not sum to n = 3.

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

**Input Format:**

Four integers x, y, z and n, each on a separate line.

**Constraints:**

Print the list in lexicographic increasing order.

**Sample input 0:**

```
1
1
1
2
```

**Sample Output 0:**

```
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
```

**Explanation 0:**

Each variable `x`

, `y`

and `z`

will have values of `0`

or `1`

. All permutations of lists in the form `[i, j, k]`

= `[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0]]`

.

Remove all arrays that sum to `n = 2`

to leave only the valid permutations.

**Sample input 1:**

```
2
2
2
2
```

**Sample output 1:**

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

## Possible solutions

Here we will discuss the possible solutions for the given problem. The following code is already given in the hacker rank website:

```
if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
```

Let us discuss the following possible solutions:

### Solution-1: Using nested for loops

We will now use the nested for loops to solve the problem:

```
if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
l = []
for i in range(x+1):
for j in range(y+1):
for k in range(z+1):
if i+j+k == n:
continue
l.append([i,j,k])
print(l)
```

The solution takes four integers as input (`x`

, `y`

, `z`

, and `n`

) and uses them to generate a list of lists of integers. It uses nested for loops to iterate through all possible combinations of the integers `i`

, `j`

, and `k`

such that `0 <= i <= x`

, `0 <= j <= y`

, and `0 <= k <= z`

. For each combination, it checks if the sum of `i`

, `j`

, and `k`

is equal to `n`

. If it is, the combination is skipped and the loop continues. If it is not, the combination is added to a list called `l`

as a sublist. Finally, the list of lists is printed.

### Solution-2: Using list comprehension

Let us now use the list comprehension to solve the problem:

```
if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
ls = [[i,j,k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if i+j+k != n]
print(ls)
```

Similar to the previous solution, it also takes four integers as input (`x`

, `y`

, `z`

, and `n`

) and uses them to generate a list of lists of integers. It is similar to the previous example, but this time it uses a list comprehension to achieve the same goal in a more concise way. The list comprehension iterates through all possible combinations of the integers `i`

, `j`

, and `k`

such that `0 <= i <= x`

, `0 <= j <= y`

, and `0 <= k <= z`

and checks if `i+j+k`

is not equal to `n`

. If the condition is met it will add `[i,j,k]`

as a sub-list to a list "`ls`

". Finally, the list of lists is printed.

### Solution-3: Alternative method

This time we will use the list comprehension in different way:

```
if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
lsti = []
lstj = []
lstk = []
lstc = []
lsti = [i for i in range(x+1)]
lstj = [j for j in range(y+1)]
lstk = [k for k in range(z+1)]
lstc =[[i, j, k] for i in lsti for j in lstj for k in lstk if i+j+k!=n]
print(lstc)
```

The code uses list comprehension to create three separate lists, `lsti`

, `lstj`

, `lstk`

, each containing all the integers from `0`

up to `x`

, `y`

and `z`

respectively. Then it uses another list comprehension to generate a list of lists lstc, by iterating through each element of `lsti`

, `lstj`

, `lstk`

and creating a sublist of `[i,j,k]`

if` i+j+k`

not equal n and then append it to the list lstc. Finally, the list of lists is printed.

## Summary

In this short article, we discussed how we can solve the list comprehension problem on hacker rank. We covered 3 different solutions with explanation.

## Further Readings

Question on Hacker Rank: Python List Comprehension [Basic Data Types]