Python 要听写的元组列表
Python list of tuples to dict
有一个python列表
[('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
我需要将其转换成具有以下结构的python字典
schema1:
table1:
(column_name1,
column_name2)
table2:
(column_name3)
schema2:
table3:
(column_name4)
有什么有效的转换方法吗?
当然可以。使用 collections.defaultdict
:
from collections import defaultdict
dd = defaultdict(lambda: defaultdict(list))
for schema, table, colname in L:
dd[schema][table].append(colname)
结果:
defaultdict(<function __main__.<lambda>>,
{'schema1': defaultdict(list,
{'table1': ['column_name1', 'column_name2'],
'table2': ['column_name3']}),
'schema2': defaultdict(list, {'table3': ['column_name4']})})
我会使用 defaultdict
来执行此操作,该 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
函数)。每当缺少一个键时,都会调用该可调用对象并将 return 值用作回退值。
行
d = defaultdict(lambda: defaultdict(list))
正在创建一个 defaultdict
,它会在缺少密钥时创建另一个 defaultdict
。第二个 defaultdict 在缺少密钥时创建 list
。
>>> d = defaultdict(lambda: defaultdict(list))
>>> d['bogus']
>>> defaultdict(list, {})
>>> d['hokus']['pokus']
>>> []
不需要任何特殊的东西,简单的字典方法就可以了:
d = [('schema1', 'table1', 'column_name1'),
('schema1', 'table1', 'column_name2'),
('schema1', 'table2', 'column_name3'),
('schema2', 'table3', 'column_name4')]
k = {}
for schema,table,column in d:
p = k.setdefault(schema,{})
p2 = p.setdefault(table,[])
p2.append(column)
print(k)
输出:
{'schema1': {'table2': ['column_name3'],
'table1': ['column_name1', 'column_name2']},
'schema2': {'table3': ['column_name4']}}
虽然更有经验的人建议不要使用它,因为它更慢。所以最好使用其他答案提供的 defaultdict-approach。
l = [('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'),
('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
d = {}
for s, t, c in l:
d[s] = d.get(s, {})
d[s][t] = d[s].get(t, tuple()) + (c,)
print(d)
输出:
{'schema1': {'table1': ('column_name1', 'column_name2'),
'table2': ('column_name3',)},
'schema2': {'table3': ('column_name4',)}}
有一个python列表
[('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
我需要将其转换成具有以下结构的python字典
schema1:
table1:
(column_name1,
column_name2)
table2:
(column_name3)
schema2:
table3:
(column_name4)
有什么有效的转换方法吗?
当然可以。使用 collections.defaultdict
:
from collections import defaultdict
dd = defaultdict(lambda: defaultdict(list))
for schema, table, colname in L:
dd[schema][table].append(colname)
结果:
defaultdict(<function __main__.<lambda>>,
{'schema1': defaultdict(list,
{'table1': ['column_name1', 'column_name2'],
'table2': ['column_name3']}),
'schema2': defaultdict(list, {'table3': ['column_name4']})})
我会使用 defaultdict
来执行此操作,该 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
函数)。每当缺少一个键时,都会调用该可调用对象并将 return 值用作回退值。
行
d = defaultdict(lambda: defaultdict(list))
正在创建一个 defaultdict
,它会在缺少密钥时创建另一个 defaultdict
。第二个 defaultdict 在缺少密钥时创建 list
。
>>> d = defaultdict(lambda: defaultdict(list))
>>> d['bogus']
>>> defaultdict(list, {})
>>> d['hokus']['pokus']
>>> []
不需要任何特殊的东西,简单的字典方法就可以了:
d = [('schema1', 'table1', 'column_name1'),
('schema1', 'table1', 'column_name2'),
('schema1', 'table2', 'column_name3'),
('schema2', 'table3', 'column_name4')]
k = {}
for schema,table,column in d:
p = k.setdefault(schema,{})
p2 = p.setdefault(table,[])
p2.append(column)
print(k)
输出:
{'schema1': {'table2': ['column_name3'],
'table1': ['column_name1', 'column_name2']},
'schema2': {'table3': ['column_name4']}}
虽然更有经验的人建议不要使用它,因为它更慢。所以最好使用其他答案提供的 defaultdict-approach。
l = [('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'),
('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
d = {}
for s, t, c in l:
d[s] = d.get(s, {})
d[s][t] = d[s].get(t, tuple()) + (c,)
print(d)
输出:
{'schema1': {'table1': ('column_name1', 'column_name2'),
'table2': ('column_name3',)},
'schema2': {'table3': ('column_name4',)}}