我有一个包含6列的MS-Access表。我想提取第一列并将其用作键,然后提取第二列和第三列并将它们用作Python字典中的值。一个键有多个值。
这是我到目前为止所做的,但我无法弄清楚下一步该做什么:
import numpy
import pyodbc
access_database_file = r"C:\Users\david\Documents\\LISTS.mdb"
ODBC_CONN_STR = r"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s;" % access_database_file
conn = pyodbc.connect(ODBC_CONN_STR)
cursor = conn.cursor()
cursor.execute("select * from LISTS")
print "..processing..."
rows = cursor.fetchall()
fieldDomains = {}
for row in rows:
k = row[0]
v1 = row[1]
v2 = row[2]
fieldDomains = {k: {v1: v2}}
print fieldDomains
当我打印fieldDomains时,我得到了这个:
{u'MAIN_VW': {u'PRESSURE_ZONE_NUM': u'LU_PRESSURE_ZONE_VW'}}
{u'MAIN_VW': {u'DIAMETER': u'LU_MAIN_DIAMR_LK_MV'}}
{u'MAIN_VW': {u'MATERIAL': u'LU_MAIN_MATRL_LK_MV'}}
{u'WATER_VW': {u'SUBTYPE': u'LU_WATER_SUBTYP_LK_MV'}}
{u'WATER_VW': {u'IS_RESTRAINED': u'LU_YES_NO_LK'}}
{u'PIPE_VW': {u'IS_TIE_IN': u'LU_YES_NO_LK'}}
{u'PIPE_VW': {u'ORIGIN': u'LU_PIPE_ORIGN_LK_MV'}}
我想将这些单独的词典合并为一个大词典 - 但我不知道如何在我当前的脚本中执行此操作?这就是我想要的输出:
{u'MAIN_VW': {u'PRESSURE_ZONE_NUM': u'LU_PRESSURE_ZONE_VW', u'DIAMETER': u'LU_MAIN_DIAMR_LK_MV', u'MATERIAL': u'LU_MAIN_MATRL_LK_MV'}, u'WATER_VW': {u'SUBTYPE': u'LU_WATER_SUBTYP_LK_MV', u'IS_RESTRAINED': u'LU_YES_NO_LK', u'PIPE_VW': {u'IS_TIE_IN': u'LU_YES_NO_LK', u'ORIGIN': u'LU_PIPE_ORIGN_LK_MV'}}
答案 0 :(得分:1)
您可以使用defaultdict
来执行此操作
>>> from collections import defaultdict
>>> data = [{u'MAIN_VW': {u'PRESSURE_ZONE_NUM': u'LU_PRESSURE_ZONE_VW'}},
{u'MAIN_VW': {u'DIAMETER': u'LU_MAIN_DIAMR_LK_MV'}},
{u'MAIN_VW': {u'MATERIAL': u'LU_MAIN_MATRL_LK_MV'}},
{u'WATER_VW': {u'SUBTYPE': u'LU_WATER_SUBTYP_LK_MV'}},
{u'WATER_VW': {u'IS_RESTRAINED': u'LU_YES_NO_LK'}},
{u'PIPE_VW': {u'IS_TIE_IN': u'LU_YES_NO_LK'}},
{u'PIPE_VW': {u'ORIGIN': u'LU_PIPE_ORIGN_LK_MV'}}]
>>> output = defaultdict(dict)
>>> for item in data:
... for k, v in item.items():
... output[k].update(v)
>>> dict(output)
{'MAIN_VW': {'DIAMETER': 'LU_MAIN_DIAMR_LK_MV',
'MATERIAL': 'LU_MAIN_MATRL_LK_MV',
'PRESSURE_ZONE_NUM': 'LU_PRESSURE_ZONE_VW'},
'PIPE_VW': {'IS_TIE_IN': 'LU_YES_NO_LK', 'ORIGIN': 'LU_PIPE_ORIGN_LK_MV'},
'WATER_VW': {'IS_RESTRAINED': 'LU_YES_NO_LK',
'SUBTYPE': 'LU_WATER_SUBTYP_LK_MV'}}
更新
由于您正在以其他格式获取数据,例如data2
,最好
>>> data2 = [[u'MAIN_VW', u'PRESSURE_ZONE_NUM', u'LU_PRESSURE_ZONE_VW'],
[u'MAIN_VW', u'DIAMETER', u'LU_MAIN_DIAMR_LK_MV'],
[u'MAIN_VW', u'MATERIAL', u'LU_MAIN_MATRL_LK_MV'],
[u'WATER_VW', u'SUBTYPE', u'LU_WATER_SUBTYP_LK_MV'],
[u'WATER_VW', u'IS_RESTRAINED', u'LU_YES_NO_LK'],
[u'PIPE_VW', u'IS_TIE_IN', u'LU_YES_NO_LK'],
[u'PIPE_VW', u'ORIGIN', u'LU_PIPE_ORIGN_LK_MV']]
>>> output2 = defaultdict(dict)
>>> for row in data2:
... output2[row[0]].update({row[1]: row[2]})
>>> dict(output2)
{'MAIN_VW': {'DIAMETER': 'LU_MAIN_DIAMR_LK_MV',
'MATERIAL': 'LU_MAIN_MATRL_LK_MV',
'PRESSURE_ZONE_NUM': 'LU_PRESSURE_ZONE_VW'},
'PIPE_VW': {'IS_TIE_IN': 'LU_YES_NO_LK', 'ORIGIN': 'LU_PIPE_ORIGN_LK_MV'},
'WATER_VW': {'IS_RESTRAINED': 'LU_YES_NO_LK',
'SUBTYPE': 'LU_WATER_SUBTYP_LK_MV'}}
所以基本上data2
是你的rows = cursor.fetchall()
,你可以用data2
变量替换rows