嵌套字典返回set()?

时间:2015-06-25 21:49:40

标签: python dictionary sqlalchemy

我正在从数据库表中动态创建字典。 hosts_list是我从host_names表格中的hosts列中选择的主机名列表。一旦我有了主机名列表,我就创建了一个字典,每个主机名都作为键,用空值初始化。 hosts_dict中的值是通过对同一个表的嵌套字典理解来设置的。

engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost: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

行: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': {...}
}

以下是我实际获得的结果:

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'
...

我怎样才能从我的目标出发到最终目标呢?

2 个答案:

答案 0 :(得分: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})

字典理解。但是,字典键的顺序是未定义的,因此假设keyx匹配,因为它们都是以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}

答案 1 :(得分:0)

这应该有效:

engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost: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()}