#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, потому что мне нужно обрезать некоторый мусор из моих входных файлов, которые я использовал для заполнения словарей.