Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要dict的元组的Python列表_Python_Python 3.x_List_Dictionary_Defaultdict - Fatal编程技术网

要dict的元组的Python列表

要dict的元组的Python列表,python,python-3.x,list,dictionary,defaultdict,Python,Python 3.x,List,Dictionary,Defaultdict,这里有一个python列表 [('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')] 我需要将其转换为具有以下结构的python dict schema1: table1: (c

这里有一个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(<function __main__.<lambda>>,
            {'schema1': defaultdict(list,
                         {'table1': ['column_name1', 'column_name2'],
                          'table2': ['column_name3']}),
             'schema2': defaultdict(list, {'table3': ['column_name4']})})
defaultdict(,
{'schema1':defaultdict(列表,
{'table1':['column_name1','column_name2'],
'表2':['列名称3']}),
'schema2':defaultdict(列表,{'table3':['column_name4']})
我会使用生成
defaultdict(列表)
实例作为默认值的

演示

>>> 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']})})
解释

defaultdict
初始值设定项接受一个可调用函数(在本例中使用了一个匿名
lambda
函数)。每当缺少键时,就会调用该可调用项,并将返回值用作回退值

线路

d = defaultdict(lambda: defaultdict(list))
正在创建一个
defaultdict
,当一个键丢失时,它会创建另一个
defaultdict
。第二个defaultdict在缺少键时创建一个
列表

>>> 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']}}

虽然更有经验的ppl建议不要使用这个,因为它速度较慢。因此,最好使用其他答案提供的defaultdict方法

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

发布一些代码,显示您迄今为止所尝试的内容。使用
defaultdict
import
有什么问题?这可能会更有效too@Chris_Randsdefaultdicts并没有什么问题,但其他两个答案已经使用了它们,这是不必要的。至于性能,我不知道哪个更快/更好。您必须测试它。Re:Performance,
setdefault
的速度较慢,因为即使密钥存在(即使在这种情况下没有使用),也会始终创建默认值。在defaultdict的情况下,它更好。这相当优雅,我没有使用这个特定的模式before@Chris_Rands,我感觉到讽刺:)不,我不认为@Chris_Rands知道这是重复;-)
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',)}}