2015-06-25 1 views
-1

Я работаю над динамическим созданием словаря из таблицы базы данных. hosts_list - это список имен хостов, которые я выбрал из столбца host_names в таблице hosts. Когда у меня есть список имен хостов, я создаю словарь с каждым именем хоста в качестве ключа, инициализированным пустым значением. Значения в host_dict устанавливаются через вложенное понимание словаря той же таблицы.Вложенный словарь возвращает set()?

engine = create_engine('postgresql+psycopg2://postgres:[email protected]:5432/cm', convert_unicode=True) 
metadata = MetaData(bind=engine) 
db = engine.connect() 
hosts = Table('hosts', metadata, autoload=True) 
results = db.execute(select({hosts})) 

hosts_list =[] 
for x in results: 
    hosts_list.append(x[hosts.c.host_name]) 

hosts_dict = dict.fromkeys(hosts_list) 
for key, value in hosts_dict.items(): 
    hosts_dict[key] = { 
    {column : value for column,value in x.items()} 
    for x in results} 

Вот данные теста я использую (отформатирован для удобства чтения):

Colums: hosts_id,host_uuid,host_name,host_ip,host_os,host_active

Row: 4; "35968946-2db0-4f85-b764-14c27ab3a57c";"test-04";"192.168.1.4";"RHEL 6.x";FALSE

Вот что моя конечная цель (отформатированные для читаемости):

{ 
    'test-01': { 
     'hosts_id':'1', 
     'host_uuid':'a5c52229-34e5-4f54-a7da-b39149dedc13', 
     'host_name':'test-01', 
     'host_os':'Ubuntu 14.04', 
     'host_active':'True'}, 
    'test-04': { 
     'hosts_id':'4' 
     'host_uuid':'35968946-2db0-4f85-b764-14c27ab3a57c' 
     'host_name':'test-04' 
     'host_ip':'192.168.1.4' 
     'host_os':'RHEL 6.6' 
     'host_active':'False'}, 
    'test-03': {...}, 
    'test-02': {...} 
} 

Здесь приведены r esults Я фактически получаю:

print(hosts_dict) 
{'test-01': set(), 'test-04': set(), 'test-03': set(), 'test-02': set()} 

Я не уверен, что это значит. Я прочитал документацию на set(), но я не совсем понимаю. С [[print("'{0}':'{1}'".format(column,value)) for column, value in v.items()] for v in results] я могу получить печать столбца и его значение в каждой строке, как это:

'hosts_id':'1' 
'host_uuid':'a5c52229-34e5-4f54-a7da-b39149dedc13' 
'host_name':'test-01' 
'host_ip':'192.168.1.1' 
'host_os':'Ubuntu 14.04' 
'host_active':'True' 
... 

Как я могу пойти от того, что у меня есть на то, что моя конечная цель?

+3

Не выполняйте [перекрестные помехи] (http://programmers.stackexchange.com/q/287881/110531). Также ваш вопрос неясен; что вы не понимаете о 'set'? Обратите внимание, что понимание набора '{x for x in y}' очень похоже на понимание словаря '{x: y для x, y в z}' ... – jonrsharpe

+0

Это сообщение о том, как решить проблемы, а другое post спрашивает, что 'set()' на самом деле, потому что я этого не понимаю. – mxplusb

+0

Ну, ваша первая проблема в том, что это не совсем понятно. Это очень сложный вопрос о программистах для * «что такое' set'? »*, И все же не объясняет, что вы прочитали, что вы узнали и что вы все еще хотите знать. Между тем этот вопрос далеко от минимального примера (http://stackoverflow.com/help/mcve). Пожалуйста, прочитайте [ask] для обоих сайтов и уточните свои точные вопросы. – jonrsharpe

ответ

0

Это должно работать:

engine = create_engine('postgresql+psycopg2://postgres:[email protected]:5432/cm', convert_unicode=True) 
metadata = MetaData(bind=engine) 
db = engine.connect() 
hosts = Table('hosts', metadata, autoload=True) 
results = db.execute(select({hosts})) 

hosts_dict = {} 
for x in results: 
    host_name = x[hosts.c.host_name] 
    hosts_dict[host_name] = {column: value for column, value in x.items()} 
+0

Я очень ценю это! – mxplusb

1
hosts_dict[key] = { 
    {column : value for column,value in x.items()} 
    for x in results} 

Представляет собой набор понимание ({item for ...}), не словарь понимание ({key: value for ...}).

hosts_dict.update({ 
    key: {column : value for column,value in x.items()} 
    for x in results}) 

Является понятием словаря. Но тогда порядок ключей словаря не определен, поэтому предположение key соответствует x, потому что оба они были получены из results в том же порядке.

hosts_dict = {x[hosts.c.host_name]: {column: value for column, value in x.items()} 
       for x in results} 

Возможно, это именно то, что вы хотите. Или даже,

hosts_dict = {x[hosts.c.host_name]: x.items() for x in results} 
+0

Ах! Что объясняет его. Я только смутно понимаю набор/словарь для начала, чтобы объяснить, где я ошибся. Спасибо за объяснение! – mxplusb

+0

Я поддержал Дэна, он знает больше, чем я. :) – Pynchia

 Смежные вопросы

  • Нет связанных вопросов^_^