Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I work with Python 3.6. I have connected to Hive using Pyhive and my cursor is cur.

Objective: Build a databases - tables map in a dictionary: dbname1 : list of tables within this db.

I have built it using for loop but I would like to transfer it to a dictionary comprehension please tell me what is wrong with my dict comprehension:

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

Note: lst is a list of databases names like ['default', 'dwh', ...]

Basically what I want is the following dict comprehension:

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

Where 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];
like image 262
steves Avatar asked May 03 '26 19:05

steves


1 Answers

To call cur.execute as additional operation in list comprehension you can use some dummy var and list (cur.execute is placed in list [ ] to create iterable with one element just to call contained function) that will not be used in result dict. And your j var is not needed and replaced by in place calling extract_dbs_tbls:

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

above is equivalent to your loop:

map_tbl_db = {}
for i in lst:
    cur.execute("use %s" % i)
    map_tbl_db[i] = extract_dbs_tbls(cur, 'show tables')
like image 197
ndpu Avatar answered May 06 '26 08:05

ndpu