我的数据结构如下:
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
时,内容都会被删除,所以这不起作用。如果我没有初始化子词典,我也无法让它工作。
任何帮助表示赞赏
答案 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}})