有一个python列表
[('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
我需要将其转换为具有以下结构的python dict
schema1:
table1:
(column_name1,
column_name2)
table2:
(column_name3)
schema2:
table3:
(column_name4)
有没有有效的转换方法?
我会使用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']})})
为了完全匹配您所需的输出(尽管我看不出太多原因),请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',)}}
说明
所述defaultdict
初始化接受一个可调用(在这个例子中一个匿名lambda
使用功能)。每当缺少键时,都会调用该callable并将返回值用作后备值。
线
d = defaultdict(lambda: defaultdict(list))
正在创建一个defaultdict
,defaultdict
当缺少密钥时会创建另一个。第二个defaultdictlist
在缺少密钥时创建一个。
>>> d = defaultdict(lambda: defaultdict(list))
>>> d['bogus']
>>> defaultdict(list, {})
>>> d['hokus']['pokus']
>>> []
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句