在用dict和list嵌套的列表上更改dict中的值

时间:2016-07-12 01:54:16

标签: python list dictionary data-structures

我得到了如下的非常大的数据,结构可能无法修复,但我想找到每个关键名称'使用'多个'使用的'到10.我怎么办?困难的部分是由于某种原因一段时间内的列表结构将被更改,并且使用的':inf应该保持不变。

[{'block_data':
      [{'item_title': u'\u4e3b\u673a',
        'item_num': 5,
        'item_class': 'hosts',
        'item_url': '/admin/hypervisors/',
        'usage': [{'used': 5, 'title': u'\u6d3b\u52a8'},
                  {'used': 5, 'title': u'\u542f\u7528'}]},
       {'item_title': u'\u8d44\u6e90',
        'usage': [{'used': 1319,
                   'limit': 1536,
                   'title': u'\u53ef\u5206\u914d\u5185\u6838'},
                  {'used': 5828230,
                   'limit': 6024840,
                   'unit': 'MB',
                   'title': u'\u53ef\u5206\u914d\u5185\u5b58'}],
        'item_class': 'resources'},
       {'item_title': u'\u9879\u76ee',
        'item_num': 24,
        'item_class': 'tenants',
        'item_url': '/identity/',
        'usage': [{'used': 23,
                   'limit': 24,
                   'title': u'\u6d3b\u52a8'}]},
       {'item_title': u'\u7528\u6237',
        'item_num': 125,
        'item_class': 'users',
        'item_url': '/identity/users/',
        'usage': [{'used': 125,
                   'limit': 125,
                   'title': u'\u6d3b\u52a8'}]}
       ],
  'block_title': u'\u8d44\u6e90'},

 {'block_data':
      [{'item_title': u'\u4e91\u4e3b\u673a',
        'item_num': 124,
        'item_class': 'instances',
        'item_url': '/admin/instances/',
        'usage': [{'used': 124,
                   'title': u'\u4e91\u4e3b\u673a'},
                  {'used': 245,
                   'title': u'\u865a\u62df\u5185\u6838'},
                  {'used': 222722,
                   'unit': 'MB',
                   'title': u'\u5185\u5b58'},
                  {'used': 15,
                   'title': u'\u5feb\u7167'}]},
       {'item_title': u'\u4e91\u786c\u76d8',
        'item_num': 69,
        'item_class': 'volumes',
        'item_url': '/admin/volumes/',
        'usage': [{'used': 69,
                   'title': u'\u4e91\u786c\u76d8'},
                  {'used': 'inf',
                   'title': u'\u4e91\u786c\u76d8\u5feb\u7167'},
                  {'used': 'inf',
                   'unit': 'MB',
                   'title': u'\u786c\u76d8\u53ca\u5feb\u7167\u5bb9\u91cf'}]},
       {'item_title': u'\u955c\u50cf',
        'item_num': 27,
        'item_class': 'images',
        'item_url': '/admin/images/',
        'usage': [{'used': 27,
                   'title': u'\u955c\u50cf'},
                  {'used': 11, 'title': u'Linux'},
                  {'used': 3, 'title': u'Windows'},
                  {'used': 13, 'title': u'ISO'}]},
       {'item_title': u'\u5b89\u5168\u7ec4',
        'item_num': 39,
        'item_class': 'access_and_security',
        'usage': [{'used': 39,
                   'title': u'\u5b89\u5168\u7ec4'}]
        }],
  'block_title': u'\u8ba1\u7b97'},

 {'block_data':
      [{'item_title': u'\u7f51\u7edc',
        'item_num': 39,
        'item_class': 'networks',
        'item_url': '/admin/networks/',
        'usage': [{'used': 39,
                   'title': u'\u7f51\u7edc'}]
        },
       {'item_title': u'\u5916\u7f51IP',
        'item_num': 40,
        'item_class': 'floating_ips',
        'usage': [{'used': 40,
                   'title': u'\u5916\u7f51IP'}]
        },
       {'item_title': u'\u8def\u7531\u5668',
        'item_num': 9,
        'item_class': 'routers',
        'item_url': '/admin/routers/',
        'usage': [{'used': 9,
                   'title': u'\u8def\u7531\u5668'}]}],
  'block_title': u'\u7f51\u7edc'}]

2 个答案:

答案 0 :(得分:0)

我认为,答案是:

for item in list:
    for usage in item['block_data']:
        for used in usage['usage']:
            new_used = used['used'] * 10

至少,该代码对我有用。

答案 1 :(得分:0)

使用列表理解:

[k['used']*10 if isinstance(k['used'], (int, long)) else k['used'] for i in a for j in i['block_data'] for k in j['usage']]
Out[29]: 
[500,
 500,
 131900,
 582823000,
 2300,
 12500,
 12400,
 24500,
 22272200,
 1500,
 6900,
 'inf',
 'inf',
 2700,
 1100,
 300,
 1300,
 3900,
 3900,
 4000,
 900]