У меня есть следующий скрипт Python:

lista_contatos = {
    "1": {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"},
    "2": {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"}

}
n = len(lista_contatos)
i = int
i = 1
print(n)

while i <= n:
    print(i)
    print(lista_contatos[i]['nome'])
    print(lista_contatos[i]['cel'])
    i = i + 1

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

Проблема в том, что когда я добавляю счетчик i в качестве ключа печати, я получаю сообщение об ошибке.

Любая помощь, как решить эту проблему?

1
Paul Mark 3 Дек 2019 в 06:21

2 ответа

Лучший ответ

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

Кроме того, циклы for являются правильной конструкцией для обхода списка, а не циклов while, которые более подходят, когда условие остановки отличается от счетчика.

lista_contatos = [
    {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"},
    {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"}
]

for elem in lista_contatos:
    print(elem['nome'], elem['cel'])

Что касается исходной проблемы, поскольку целые числа являются недопустимыми значениями для ключей dict, {"1": "foo"}[1] создает ваш KeyError. Вам нужно преобразовать i в строку,

lista_contatos[str(i)]['cel']
#              ^^^^^^

Это должно быть похоже на прыжок через обруч, и это красный признак того, что что-то пошло не так с выбором структуры данных.

Это не значит, что цикл по словарям всегда бесполезен, но способ его работы заключается в превращении словаря в просмотреть объект, используя some_dict.items(), some_dict.keys() или some_dict.values(). Если вы используете Python <3.6, порядок не гарантируется (используйте collections.OrderedDict). Счетчик вроде i ни в коем случае не попадет на сцену.

Намерение i = int, вероятно, состоит в том, чтобы объявить тип. Но это псевдоним int, который является встроенным типом, используемым для приведения к переменной i. Вам не нужно объявлять типы в Python, как это; просто напишите i = 1 и Python знает, что это целое число автоматически:

>>> i = 1      
>>> type(i)    
<class 'int'>  

Когда на самом деле использовать словарь? Ответ: всякий раз, когда вам нужны быстрые поиски для связанных элементов на основе пары ключ-значение, где ключом является некоторый уникальный, хешируемый идентификатор, отличный от последовательного целого числа из 0..n. Представьте себе перечень товаров, каждый из которых имеет в качестве ключа произвольный номер UPC или SKU, а остальные данные о продукте - как набор свойств.

2
ggorlen 3 Дек 2019 в 04:14

В основном вам нужно сделать печать DFS.

lista_contatos = {"1": {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"},
                "2": {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"}}

def printDict(d):
    for k, v in d.items():
        print('key: ', k)
        if type(v) is dict:
            printDict(v)
        else:
            print('value: ', v)
printDict(lista_contatos)

Результат:

key:  2
key:  id_cidade
value:  449139
key:  cidade
value:  SP
key:  nome
value:  Junior
key:  cel
value:  +999999999
key:  1
key:  id_cidade
value:  449139
key:  cidade
value:  SP
key:  nome
value:  Paul
key:  cel
value:  +9999999999
0
Ke Zhu 3 Дек 2019 в 03:33