Python, ошибка Flask — TypeError: индексы строкового индекса должны быть целыми числами или срезами, а не str

#python #flask

#python #flask

Вопрос:

Цель: распечатать значения словаря с помощью цикла for

Вот воссозданная версия кода в качестве ссылки (не фактический код, работает точно так же):

 import networkx as nx
random_dictionary = {
"name": "DAG",
"children": "None",
"father": "None",
"mother": "None",
"spouse": "None",
}

serializable_format = random_dictionary

for n in serializable_format:
    print("[ ] node: "   n   ", edge: "   str(serializable_format[n]['pre_transactions']))
    for x in serializable_format[n]['pre_transactions']:
        ledger.add_edge(n, x)
 

Когда я его выполняю, я постоянно сталкиваюсь со следующей ошибкой…

 TypeError: string index indices must be integers or slices, not str
 

Я не могу вставить целое число в [n] раздел, так как это выдало бы мне следующую ошибку

 KeyError: (insert any number here)
 

Итак, как мне создать цикл for, который получает содержимое из словаря, не сталкиваясь с какими-либо ошибками?

Ответ №1:

Давайте разделим ответ на две части.

Во-первых, чтобы «распечатать значения словаря через цикл for», как и было запрошено, вы просто делаете:

 for k in serializable_format:
    print(serializable_format[k]
 

цикл перебирает ключи словаря. Вы должны проверить официальную документацию по dicts, особенно часть «Методы зацикливания». Вы найдете dict.items() полезное использование.

Проблема в вашем коде в том, что serializable_format[n] это строка («DAG», «None» и т. Д.). Выражение serializable_format[n]['pre_transactions'] пытается использовать строку 'pre_transactions' для индексации первой строки, вызывая a TypeError . Перепроверьте свой код, потому что вы ошибочно принимаете эти строки за какой-то другой тип (например dicts ), к которому можно получить доступ с помощью ключей (например 'pre_transactions' ). Возможно, ваш словарь должен быть не словарем строк, а словарем объектов другого типа.

Обратите внимание, что в вашем коде один цикл вложен в другой, поэтому для каждого ключа вы повторяете цикл снова.

Комментарии:

1. Большое спасибо за помощь!!! Хорошо, когда я удаляю [‘pre_transactions’] , код функционирует, но как именно вы бы порекомендовали включить [‘pre_transactions’] обратно в код, чтобы он мог функционировать?

2. Добро пожаловать. Я расширил ответ, предоставив дополнительную информацию, но я думаю, что это ответ на вопрос, который вы опубликовали. Невозможно улучшить его, не зная, что вы ожидаете сделать. Часть `[‘pre_transactions’]` не имеет смысла. Я предполагаю, что вы хотите вызвать add_edge пару (ключ, значение), но это не ответ на вопрос, который вы опубликовали. Я предполагаю, что вы хотите сделать что-то в строке for k, v in serializable_format.items(): print("[ ] node: " k ", edge: " str(serializable_format[k])) ledger.add_edge(k, v) , но это только предположение.

3. Это именно то, что я намеревался сделать, спасибо, чувак!