Python: печать словаря словаря с переменными

#python #dictionary

#python #словарь

Вопрос:

Я пытаюсь извлечь некоторые значения из словаря, это должно быть довольно легко.

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

У меня есть два словаря, один с отображением uid -> имен пользователей (через getent passwd), и второй словарь, который содержит словарь для каждого ключа, в основном:

 dMap = { 12345678: 'username' }
qDict['12345678'] = {'used': '4204224',  'grace': 'none', 'quota': '5242880'}
 

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

Ключом для qDict будет uid (который должен быть отображен через словарь dMap)

У меня возникли проблемы со следующим:

 for k,v in dMap.items():
    print 'Key: ',k
    print qDict[k]
 

Когда я запускаю скрипт, я получаю:

 Traceback (most recent call last):
  File "./test.py", line 156, in ?
    main() 
  File "./test.py", line 98, in main
    print qDict[k]
KeyError: 26617862
 

Если я закомментирую строку: print qDict[k] выше и выведу только значение k, имена ключей будут напечатаны без проблем. Я также могу ссылаться на словарь вне цикла for с фактическим именем ключа (12345678):

 print dMap[26617862]         # this works!
print qDict['26617862']      # this works!      #NOTE BELOW
 

То, что я пытаюсь сделать, это просто заставить цикл for печатать словарь для данного ключевого имени, своего рода печать словаря словаря…

Я думаю, проблема в том, что (если вы посмотрите на строку #NOTE НИЖЕ) Мне нужно как-то представить словарь (qDict) с правильно отформатированной переменной.

Есть ли что-то, чего мне здесь не хватает, или есть более простой способ сделать это?

PS: Я также пробовал цикл for с dMap.keys() и т. Д.

Ответ №1:

Ключи в dMap — это целые числа, а в qDict ключах — строки.

Вам необходимо преобразовать целое k число в строку, прежде чем использовать его в качестве ключа в qDict :

 for k in dMap:
    print 'Key: ',k
    print qDict[str(k)]
 

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

1. Да, это было именно так! Я недавно перешел из perl, и я не помню подобных проблем, но я могу ошибаться… Спасибо за помощь.

Ответ №2:

Вы создали два словаря, используя разные типы ключей. Один dict имеет целочисленный ключ, а другой — строковый ключ.

Как сказал @Mark Byers, вы можете преобразовать целое число в строку, чтобы выполнить поиск.

Однако я рекомендую вам вместо этого строить qDict с помощью целочисленных ключей. Где бы ни находился ваш код, который строится qDict , оберните ключ, int() чтобы заставить его быть целочисленным ключом.

На самом деле сработает в любом случае. Но если dMap есть int ключи и qDict есть str ключи, есть некоторые возможные ключи qDict , которые не могут появиться в dMap , и если эти два должны совпадать, лучше, если у них просто один и тот же тип ключа. И int должен быть немного более эффективным, так что если ваша программа масштабируется в больших масштабах, это лучший выбор.

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

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