Search code examples
pythonnested-loops

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


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)


Solution

  • 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]])