2016-10-23 5 views
0

У меня есть 2d массив, X, который выглядит как этотПодсчет последовательных чисел во всех столбцах 2D массива

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

Я пытаюсь перебирать весь массив 2D, чтобы попытаться сосчитать все экземпляры где есть два последовательных элемента в столбце. Например. X выше вернул бы 4 (X[1][1] == X[2][1] && X[1][2] == X[2][2] && X[2][2] == X[3][2] и т. Д.)

Я нахожу это очень трудным для визуализации. До сих пор у меня есть:

def get_opposite(number): 
    if number == 2: return 1 
    if number == 1: return 2 

def counter(X, number): 
     count = 0 
     for i in range(len(X)): 
      for j in range(len(X[i])-1): 
        if X[i][j] == X[i][j+1] and X[i][j] != 0 and X[i][j] != get_opposite(number): 
         count += 1 
     return count 

Я продолжаю либо получать значительно неправильные результаты, или IndexError, он должен быть довольно прямо вперед, но я не уверен, что я делаю неправильно

+0

Почему ваша функции счетчика нужна второй аргумент? Кажется неуместным прочитывать вопрос, который вы задаете ... – trincot

ответ

1

Если сравнить пример вы указываете в тексте свой фактический код, вы заметите, что ваш код сравнивается со значением на справа, а не со значением ниже. Вам нужно применить +1 к первому индексу, а не ко второму. Это также означает, что диапазон ваших петель должен быть соответствующим образом адаптирован.

Во-вторых, вам не нужна первая функция. Сравнение равенств достаточно.

Кроме того, я удалил второй аргумент функции, так как она не служит никакой роли:

def counter(X): 
    count = 0 
    for i in range(len(X)-1): 
     for j in range(len(X[i])): 
      if X[i][j] == X[i+1][j] and X[i][j] != 0: 
       count += 1 
    return count 
Смежные вопросы