用于dict的Python元组列表

Tak*_*oro 3 python dictionary list python-3.x defaultdict

有一个python列表

[('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
Run Code Online (Sandbox Code Playgroud)

我需要将它转换为具有以下结构的python dict

schema1:
            table1:
                    (column_name1,
                    column_name2)
            table2:
                    (column_name3)
schema2:
            table3:
                    (column_name4)
Run Code Online (Sandbox Code Playgroud)

有没有有效的转换方式?

jpp*_*jpp 6

当然.用途collections.defaultdict:

from collections import defaultdict

dd = defaultdict(lambda: defaultdict(list))

for schema, table, colname in L:
    dd[schema][table].append(colname)
Run Code Online (Sandbox Code Playgroud)

结果:

defaultdict(<function __main__.<lambda>>,
            {'schema1': defaultdict(list,
                         {'table1': ['column_name1', 'column_name2'],
                          'table2': ['column_name3']}),
             'schema2': defaultdict(list, {'table3': ['column_name4']})})
Run Code Online (Sandbox Code Playgroud)


tim*_*geb 5

我这样做defaultdict会产生defaultdict(list)实例作为默认值.

演示

>>> from collections import defaultdict
>>> 
>>> d = defaultdict(lambda: defaultdict(list))
>>> data = [('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
>>> 
>>> for k1, k2, v in data:
...:    d[k1][k2].append(v)
...:    
>>> d
>>> 
defaultdict(<function __main__.<lambda>()>,
            {'schema1': defaultdict(list,
                         {'table1': ['column_name1', 'column_name2'],
                          'table2': ['column_name3']}),
             'schema2': defaultdict(list, {'table3': ['column_name4']})})
Run Code Online (Sandbox Code Playgroud)

要准确匹配您想要的输出(虽然我没有太多理由),请d使用tuple值构建常规字典.

>>> d = {k1:{k2:tuple(v2) for k2, v2 in v1.items()} for k1, v1 in d.items()}
>>> d
>>> 
{'schema1': {'table1': ('column_name1', 'column_name2'),
  'table2': ('column_name3',)},
 'schema2': {'table3': ('column_name4',)}}
Run Code Online (Sandbox Code Playgroud)

说明

所述defaultdict初始化接受一个可调用(在这个例子中一个匿名lambda功能时).只要缺少某个键,就会调用该callable,并将返回值用作回退值.

这条线

d = defaultdict(lambda: defaultdict(list))
Run Code Online (Sandbox Code Playgroud)

正在创建一个在缺少密钥时defaultdict创建另一个defaultdict.第二个defaultdict创建list一个密钥丢失的时间.

>>> d = defaultdict(lambda: defaultdict(list))
>>> d['bogus']
>>> defaultdict(list, {})
>>> d['hokus']['pokus']
>>> []
Run Code Online (Sandbox Code Playgroud)