Home > Enterprise >  Searching within Nested lists in Python || How do I match a 1-index nested list, with a 2-index nest
Searching within Nested lists in Python || How do I match a 1-index nested list, with a 2-index nest

Time:09-15

here is the problem I am trying to solve:

coord = [[0, 0], [1, 0], [1, 1], [2, 0], [2, 1], [2, 1], [2, 2] ..]

new_arr = [[[0, 0], 1], [[1, 0], 1], [[1, 1], 1], [[2, 0], 1], [[2, 1], 2], [[2, 2], 1] ..]

This is the target I am trying to map to

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

the ultimate output would be the counts against each of the coordinates

1 0 0 
1 1 0 
1 2 1  

------ clarifications --------

the goal is to generate this square of numbers (counts) which is the second element in new_arr. E.g. [[0, 0], 1], [[1, 0], 1], can be interpreted as the value 1 for the coordinate [0,0] and value 1 for coordinate [1,0] 

the first list (coord) is simply a map of the coordinates. The goal is to get the corresponding value (from new_arr) and display it in the form of a square. Hope this clarified. The output will be a grid of the format

1 0 0 
1 1 0 
1 2 1

to the question of N (I just took a sample value of 3). The actual use case is when the user enters an integer, say 6 and the result is in a 6 X 6 square. The counts are chess move computations on the ways to reach a specific cell (two movements only (i 1, j) & (i 1, j 1) ....... starting from (0,0)

CodePudding user response:

Use numpy:

import numpy as np

i = []
coord = [[0, 0], [1, 0], [1, 1], [2, 0], [2, 1], [2, 1], [2, 2]]

new_arr = [[[0, 0], 1], [[1, 0], 1], [[1, 1], 1], [[2, 0], 1], [[2, 1], 2], [[2, 2], 1]]

result = np.zeros([coord[-1][0]   1, coord[-1][1]   1])
 
for i in new_arr:
    for j in coord:
        if i[0] == j:
            result[j[0],j[1]]= i[1]
        
print(result)

Output:

[[1. 0. 0.]
 [1. 1. 0.]
 [1. 2. 1.]]

CodePudding user response:

The logic is not fully clear, but is looks like you want to map the values of new_arr on the Cartesian product of coordinates:

N = 3 # how this is determined is unclear

d = {tuple(l):x for l, x in new_arr}
# {(0, 0): 1, (1, 0): 1, (1, 1): 1, (2, 0): 1, (2, 1): 2, (2, 2): 1}

out = [d.get((i,j), 0) for i in range(N) for j in range(N)]
# [1, 0, 0, 1, 1, 0, 1, 2, 1]

# 2D variant
out2 = [[d.get((i,j), 0) for j in range(N)] for i in range(N)]
# [[1, 0, 0],
#  [1, 1, 0],
#  [1, 2, 1]]

alternative with

import numpy as np

N = 3
a = np.zeros((N,N), dtype=int)

# get indices and values
idx, val = zip(*new_arr)

# assign values (option 1)
a[tuple(zip(*idx))] = val

# assign values (option 2)
a[tuple(np.array(idx).T.tolist())] = val

print(a)

output:

array([[1, 0, 0],
       [1, 1, 0],
       [1, 2, 1]])
  • Related