Sir AskA Lot
Sir AskA Lot

Reputation: 23

How can I find specific values inside a multidimensional array?

I'm making a game that's a lot like checkers, to create the board I used a multidimensional array. I populate the array with 0's on every empty space and then the one set of chips is represented by 1's and the other is represented by 2's. Is there any way in which I can get a list of what spaces are being occupied by each set of chips? This is my gameboard:

matrix = [[1,1,1,1,1,0,0,0,0,0], [1,1,1,1,0,0,0,0,0,0],
          [1,1,1,0,0,0,0,0,0,0], [1,1,0,0,0,0,0,0,0,0],
          [1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,2],
          [0,0,0,0,0,0,0,0,2,2], [0,0,0,0,0,0,0,2,2,2],
          [0,0,0,0,0,0,2,2,2,2], [0,0,0,0,0,2,2,2,2,2]]

print "\n".join(" ".join(str(el) for el in row) for row in matrix)

Upvotes: 0

Views: 59

Answers (2)

martineau
martineau

Reputation: 123541

While list-comprehensions are often a nice way to build a single list, you'll have to go through the entire matrix multiple times to find the positions of every possible chip value. Alternatively, you could create lists of which spaces are occupied by each kind of chip in a single pass through the matrix by doing something like the following:

matrix = [[1,1,1,1,1,0,0,0,0,0], [1,1,1,1,0,0,0,0,0,0],
          [1,1,1,0,0,0,0,0,0,0], [1,1,0,0,0,0,0,0,0,0],
          [1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,2],
          [0,0,0,0,0,0,0,0,2,2], [0,0,0,0,0,0,0,2,2,2],
          [0,0,0,0,0,0,2,2,2,2], [0,0,0,0,0,2,2,2,2,2]]

positions = {}
for y in xrange(len(matrix)):
    for x in xrange(len(matrix)):
        positions.setdefault(matrix[y][x], []).append((y, x))

# show the all positions of each chip value
for chip in sorted(positions):
    print('{}: {}'.format(chip, positions[chip]))

Output:

0: [(0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4)]
1: [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (4, 0)]                                                                                                                                                                                                                                                                                                                                                                                                                                                        
2: [(5, 9), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 6), (8, 7), (8, 8), (8, 9), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]                                                                                                                                                                                                                                                                                                                                                                                                                                                        

Upvotes: 0

niemmi
niemmi

Reputation: 17273

You can use list comprehension with condition, following code returns all the spaces occupied by 2:

[(y, x) for y in xrange(len(matrix)) for x in xrange(len(matrix[y])) if matrix[y][x] == 2]

Output:

[(5, 9), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 6), (8, 7), (8, 8), (8, 9), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]

Upvotes: 4

Related Questions