使用多个命令(Python、curser.execute)列出对字典的理解?

List comprehension to dictionary with multiple commands (Python, curser.execute)?

我使用 Python 3.6。 我已经使用 Pyhive 连接到 Hive,我的光标是 cur。

Objective: 建立一个数据库——字典中的表映射: dbname1 : 此数据库中的表列表。

我已经使用 for 循环构建了它,但我想将它转移到字典理解中,请告诉我我的字典理解有什么问题:

lst = extract_dbs_tbls(cur, s = 'show databases')

map_tbl_db = {}

for i in lst:
    cur.execute("use %s" % i)
    map_tbl_db['i'] = extract_dbs_tbls(cur, 'show tables')

注意:lst 是数据库名称的列表,例如 ['default', 'dwh', ...]

基本上我想要的是以下字典理解:

{i:j for i in lst cur.execute('use %i' % i) j = extract_dbs_tbls(cur, s = 'show tables')}

其中 extract_dbs_tbls:

def extract_dbs_tbls(cur, s = 'show tables'):

    "Return list of dbs / tables. Note: use before 'use db_name'."

    cur.execute(s)
    lst = cur.fetchall()

    return [j[0] for j in lst];

要调用 cur.execute 作为列表理解中的附加操作,您可以使用一些虚拟变量和列表(cur.execute 放置在列表 [ ] 中以创建一个元素的可迭代对象,只需调用包含的函数)不会在结果字典中使用。并且不需要您的 j var 并替换为就地调用 extract_dbs_tbls:

{i: extract_dbs_tbls(cur, s = 'show tables')
 for i in lst
 for dummy in [cur.execute('use %i' % i)]}

以上相当于你的循环:

map_tbl_db = {}
for i in lst:
    cur.execute("use %s" % i)
    map_tbl_db[i] = extract_dbs_tbls(cur, 'show tables')