2017-06-17 139 views
1

我有一个defaultdict(dict)值:如何从现有密钥设置新密钥:defaultdict的值对?

defaultdict(<class 'dict'>, { 
    'AL2G22360.t1_Sp': { 
    'locus': 'AL2G22360.t1', 
    'length': '663', 
    'strain': 'Sp'}, 
    'AL2G22360.t1_My': { 
    'locus': 'AL2G22360.t1', 
    'length': '389', 
    'strain': 'My'}, 
    'AL2G22220.t1_My': { 
    'locus': 'AL2G22220.t1', 
    'length': '865', 
    'strain': 'My'}, 
    'AL2G22220.t1_My': { 
    'locus': 'AL2G22220.t1', 
    'length': '553', 
    'strain': 'My' ........}}) 

说,我想改变它的方式,在major keyvalue of variable **locus**。因为有一个locus value(非唯一,但有些可能是唯一的)的副本,我想从variable **strain**有另一个子键My vs. Sp。其余数据可以保持原样。

预期输出:

defaultdict(<class 'dict'>, { 
    'AL2G22360.t1': { 
    'Sp': { 
     'keys': 'AL2G22360.t1_Sp', 
     'length': '663'}, 
    'My': { 
     'keys': 'AL2G22360.t1_My', 
     'length': '389'}}, 
    'AL2G22220.t1': { 
    'My': { 
     'keys': 'AL2G22220.t1_My', 
     'length': '865'}, 
    'Sp': { 
     'keys': 'AL2G22220.t1_Sp', 
     'length': '553'}, .....}}) 
+0

“期望的输出”在语法上不正确。我猜你的意思是什么,并据此编辑你的问题。请确认我没有误解你。 – Alfe

+0

@Alfe:你做得很好。谢谢。我的头痛如何解决这个问题。你有任何提示吗? – everestial007

+0

我刚更新了'variable keys',以确保问题很简洁。但是,这个问题的意图是一样的。 – everestial007

回答

1

我会做这样的:

result = defaultdict(lambda: defaultdict(dict)) 
for k, v in a.items(): 
    result[v['locus']][v['strain']] = { 'keys': k, 'length': v['length'] } 
return result 

这将创建一个defaultdict其值再次是defaultdicts其值类型的字典。 (这与您指定的输出相匹配。)然后,通过遍历原始文件并将所有值复制到新格式中,直接进行填充。

+0

你能否提供一些解释,以便我能理解这个过程?这很好学习。非常感谢 ! – everestial007

+0

对不起,它现在工作,顺便说一句。 – everestial007

+0

我添加了一个简短的描述。您可以通过在每次迭代中输出'result','k'和'​​v'来获得更多的见解。你可能想使用'pprint'来格式化输出。 – Alfe