Python嵌套dict的元组列表

时间:2016-02-05 13:01:12

标签: python dictionary

我的数据结构如下:

APP_ENV=production
APP_DEBUG=false
APP_KEY=XXXXX

DB_HOST=localhost
DB_DATABASE=klaabowling
DB_USERNAME=XXXXXXX
DB_PASSWORD=XXXXXXX

CACHE_DRIVER=file
SESSION_DRIVER=file

DOMAIN_BASE=klaabowling.com
APP_URL=http://klaabowling.com

AWS_REGION=us-west-2
AWS_AccessKey=XXXXXX
AWS_SecretAccessKey=XXXXXX

GOOGLE_MAPS_API_KEY=XXXXXX

我希望将其转换为表格

的嵌套字典
[(a,x1,1),(a,x2,5),(b,x1,1) ...]

我试过

{a:{x1:1, x2:5}, b:{x1:1}...}

但每次我dictdata = {} for row in rows: ean = row[1].encode('ascii','ignore') period = str(row[0]) value = row[2] dictdata[ean]={} # init sub dictionary dictdata[ean][period] = value 时,内容都会被删除,所以这不起作用。如果我没有初始化子词典,我也无法让它工作。

任何帮助表示赞赏

4 个答案:

答案 0 :(得分:3)

这是一个问题collections.defaultdict是为了解决而构建的:

https://docs.python.org/2/library/collections.html#collections.defaultdict

from collections import defaultdict
dictdata = defaultdict(dict)
rows = [('a','x1',1),('a','x2',5),('b','x1',1) ]
for row in rows:
    ean = row[1].encode('ascii','ignore')
    period = str(row[0])
    value = row[2]
    dictdata[period][ean] = value
dictdata

返回

{'a': {'x2': 5, 'x1': 1}, 'b': {'x1': 1}}

答案 1 :(得分:2)

同样的事情,但使用defaultdict

from collections import defaultdict
rows = [("a", "x1", 1), ("a", "x2", 5), ("b", "x1", 1)]

d = defaultdict(dict)
for k, v, v2 in rows:
    d[k][v] = v2

答案 2 :(得分:1)

您可以在一个声明中完成

rows = [('a','x1',1),('a','x2',5),('b','x1',1)]
result = dict()
for key1, key2, value in rows:
  result.setdefault(key1, {}).update({key2: value})

答案 3 :(得分:0)

作为对代码的修复,正确的方法是始终如果你已经创建了字典,如果没有,那么实例化一个,如下所示:

>>> l
[('a', 'x1', 1), ('a', 'x2', 5), ('b', 'x1', 1)]
>>> d = {}
>>> for row in l:
        ean = row[1].encode('ascii','ignore')
        period = str(row[0])
        value = row[2]
        if period not in d:
            d[period] = {}
        if ean not in d[period]:
            d[period][ean] = {}
        d[period][ean] = value


>>> d
{'a': {b'x1': 1, b'x2': 5}, 'b': {b'x1': 1}}

您也可以使用defaultdict来自馆藏,非常直接:

>>> l = [('a','x1',1),('a','x2',5),('b','x1',1)]
>>>
>>> from collections import defaultdict
>>> 
>>> 
>>> d = defaultdict(dict)
>>> 
>>> for k, k_sub, v in l:
        d[k][k_sub] = v

>>> d
defaultdict(<class 'dict'>, {'a': {'x1': 1, 'x2': 5}, 'b': {'x1': 1}})