字典的元组的Python列表

时间:2018-10-24 17:05:49

标签: 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字典

schema1:
            table1:
                    (column_name1,
                    column_name2)
            table2:
                    (column_name3)
schema2:
            table3:
                    (column_name4)

有没有有效的转换方法?

4 个答案:

答案 0 :(得分:6)

好的。使用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']})})

答案 1 :(得分:5)

我将使用defaultdict来执行此操作,该{{3}}会产生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也将创建另一个list。第二个defaultdict在缺少密钥时创建一个>>> d = defaultdict(lambda: defaultdict(list)) >>> d['bogus'] >>> defaultdict(list, {}) >>> d['hokus']['pokus'] >>> []

# Static files (CSS, JavaScript, Images)

# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'

#STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'`enter code here`

#MEDIA_ROOT = '/home/myshop/media'

STATICFILES_DIRS = [

    os.path.join(BASE_DIR, '/static/'),

    os.path.join(BASE_DIR, '/media/'),

]

STATIC_ROOT = '/home/myshop/staticfiles'

答案 2 :(得分:3)

不需要任何特殊的东西,简单的字典方法就可以工作:

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方法。

答案 3 :(得分:1)

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