Python функция для возврата индекса размерного массива - PullRequest
1 голос
/ 17 июня 2020

Итак, у меня есть функция, которая находит позицию класса в многомерном массиве, и другая функция, которая принимает это значение и преобразует его (или, по крайней мере, пытается) в индекс, который можно использовать для доступа и возврата этого класса. .

def get_class(condition1, condition2):
    key = ""
    if(condition1):
        key += "1 "
    else:
        key += "0 "
    if(condition2):
        key += "1 "
    else:
        key += "0 "
    key = get_key(key)

    return classes[key]

Он работает, просто добавляя строку по мере ее продвижения, причем каждая 1 означает перемещение по определенной оси по массиву.

Функция, которая переводит это в индекс:

def get_key(value):
    key = value.split()
    for character in key:
        character = int(character)
        print(type(character))

    return key

Предполагается преобразовать строки в целые числа, а затем вернуть позицию в массиве, но все, что я получаю, это ошибка:

TypeError: list indices must be integers or slices, not list

Есть ли лучший способ сделать это, или что я делаю не так?

Изменить:

Пример данных:

condition1 = True condition2 = False

classes = [[6, 8], [21, 754]]

ожидаемый результат: 21, с ключом [1] [0]

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Проблема в том, что ваша строка key не обновляется в функции get_key(). Вы правильно разделяете ключ на целые числа, но вы не используете эти целые числа.

Если ваш ключ ввода «1 0», вы также возвращаете «1 0», и программа вылетает при вызове classes[key] или classes["1 0"].

Изменить: пока вы ограничены 2-мерными массивами, вы можете использовать:

def get_key(value):
    key = value.split()
    for character in key:
        yield int(character)

def get_class(condition1, condition2):
    key = ""
    if(condition1):
        key += "1 "
    else:
        key += "0 "
    if(condition2):
        key += "1 "
    else:
        key += "0 "

    x, y = get_key(key)
    return classes[x][y]

Если добавлены дополнительные измерения, вам нужно будет указать больше возвращаемых значений из get_key(), но я не знаю, как сделать этот c generi. Надеюсь, это поможет.

0 голосов
/ 17 июня 2020

Вы все делаете нормально, за исключением небольшой ошибки.

В функции get_key вы пытаетесь преобразовать и вывести целочисленную ценность. Но при возврате значения вы возвращаете переменную key

. Убедитесь, что ваша переменная key имеет значение, возвращенное из value.split(). Итак, значение в key - это список, и вы возвращаете этот список.

Теперь для доступа к списку classses вам нужны правильные целочисленные индексы, но вместо этого вы передаете этот список как индекс.

Отсюда ошибка.

Теперь часть решения:

def get_class(condition1, condition2):
    key = ""
    if(condition1):
        key += "1 "
    else:
        key += "0 "
    if(condition2):
        key += "1 "
    else:
        key += "0 "
    key = get_key(key)

    return classes[key[0]][key[1]]


def get_key(value):
    key = value.split()
    int_list = []
    for character in key:
        character = int(character)
        print(type(character))

        int_list.append(character)
    return int_list

Вышеупомянутое решение сделано путем изменения вашего кода.

Но это можно сделать и больше легко и четко, если вы хотите увидеть, что:

def get_class(condition1, condition2):
    if(condition1):
        key1 = 1
    else:
        key1 = 0

    if(condition2):
        key2 = 1
    else:
        key2 = 0

    return classes[key1][key2]

Это приведет к тому же результату, что и ожидалось, но если у вас есть какое-либо конкретное требование c для реализации его в разных функциях и сохранения ключа в виде строки, тогда вы можете go вперед с предыдущим кодом.

Надеюсь, это поможет. Ура.

0 голосов
/ 17 июня 2020

Согласно вашему коду, key имеет список типов при достижении return classes[key]:

>>> key = "10"
>>> key.split()
['10']

Это приводит к

>>> classes = [[6, 8], [21, 754]]
>>> classes [key]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str

РЕДАКТИРОВАТЬ: вы можете решить его, сохранив индексы в get_class функционируют как целые числа в списке.

classes = [[6, 8], [21, 754]]
keys = [1, 0]
for key in keys:
    classes = classes[key]
print( "%s" % classes )
...