Python список не добавляется правильно (IndexError: индекс списка вне допустимого диапазона) - PullRequest
0 голосов
/ 30 мая 2020

Я пробовал разные подходы в течение 3 часов и просто не понимаю, почему это не работает.

current_stock_dict = db.execute("SELECT * FROM current_stocks WHERE c_user_id=:user_id ", user_id=session["user_id"])

    # make a list for the mainpage
    mainpage_list = [[],[]]

    # save the lengh of the dict
    lengh_dict = len(current_stock_dict)
    price_sum = 0
    share_sum = 0

    # iterate over all rows in the dict
    for i in range(0, (lengh_dict - 1)):

        # lookup the symbol in the current stocks
        c_symbol = current_stock_dict[i]["c_symbol"]
        lookup_symbol = lookup(c_symbol)

        # append the symbol to the list for the mainpage
        mainpage_list[i].append(c_symbol)

        # append the name of the share
        share_name = lookup_symbol["name"]
        mainpage_list[i].append(share_name)

        # append the count of shares for mainpage
        c_count = current_stock_dict[i]["c_count"]
        mainpage_list[i].append(c_count)

        # append the current price
        share_price = lookup_symbol["price"]
        mainpage_list[i].append("$" + str(share_price))

        # append the total price of all shares
        total_price = float(share_price) * int(c_count)
        mainpage_list[i].append("$" + str(total_price))

        # count up the price and shares
        price_sum += total_price
        share_sum += c_count

Когда я запускаю свой веб-сайт через Flask, я получаю сообщение об ошибке: IndexError: индекс списка вне диапазона в строке: mainpage_list[i].append(c_symbol) (и я думаю, если бы он не завершился ошибкой, я бы получил его и для остальных строк).

Пока lengh_dict = len(current_stock_dict) равно 3 или меньше (так что SQL db имеет 3 строки или меньше) сообщение об ошибке не появляется, и код работает нормально. Я не совсем понимаю списки (и многомерные списки) в python, поэтому я был бы счастлив, если бы кто-нибудь мог объяснить мне мою ошибку.

Обычно я распечатываю много вещей и просто пробую где ошибка в том, что я только начал использовать flask, и я не могу распечатать списки, dicts или что-то еще, если код останавливается до достижения ошибки.

Всем уже спасибо за вашу помощь !!!

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Давайте посмотрим на соответствующую часть вашего кода.

mainpage_list = [[],[]]
for i in range(0, (lengh_dict - 1)):
    mainpage_list[i].append(c_symbol)

mainpage_list - это список, содержащий два элемента, оба из которых являются пустыми списками. Итак, доступ к mainpage_list[0] - это первый список внутри mainpage_list, а mainpage_list[1] - второй пустой список. Любой указатель выше, который приведет к IndexError.

Не совсем понятно, чего вы пытаетесь достичь, но вы можете инициализировать mainpage_list с правильным количеством пустых списков внутри, если это то, что вы нужно, например, в случае, когда вы хотите столько пустых списков, сколько current_stock_dict, вы можете сделать

mainpage_list = [ [] for _ in range(length_dict) ]
0 голосов
/ 30 мая 2020

Проблема здесь в том, что список mainpage_list состоит из двух элементов, и вы пытаетесь получить доступ к третьему его элементу.

Как правило, при обработке списков неопределенного размера я предпочитаю повторять и добавлять в список, а не индексировать.

Это дает вам что-то вроде:

source = ["abc", "def", "ghi"]  # List of data to process
target = []  # The processed data

for row in source:  # For every row of data
    value = []  # Empty list to accumate result in
    value.append(row[2])
    value.append(row[1])
    value.append(row[0])
    target.append(value)

print(target)

, который будет работать для любого размера исходного списка.

Применение этого к вашему коду дает вам:

# current_stock is a list of dictionaries.
current_stock = db.execute("SELECT * FROM current_stocks WHERE c_user_id=:user_id ", user_id=session["user_id"])

# make a list for the mainpage
mainpage_list = []

price_sum = 0
share_sum = 0

# iterate over all rows in current_stock
for row in current_stock:
    value = []

    # lookup the symbol in the current stocks
    c_symbol = row["c_symbol"]
    lookup_symbol = lookup(c_symbol)

    # append the symbol to the list for the mainpage
    value.append(c_symbol)

    # append the name of the share
    share_name = lookup_symbol["name"]
    value.append(share_name)

    # append the count of shares for mainpage
    c_count = row["c_count"]
    value.append(c_count)

    # deleted code

    # count up the price and shares
    price_sum += total_price
    share_sum += c_count

    mainpage_list.append(value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...