【问题标题】:iter over a list nested with dict and list to change value in dict迭代与 dict 和 list 嵌套的列表以更改 dict 中的值
【发布时间】:2016-11-14 02:26:25
【问题描述】:

我得到了一个像下面这样的非常大的数据,结构可能不固定,但我想找到每个键名是'used',将'used'的值乘以10。我该怎么做?困难的部分是列表结构一段时间后会因某种原因发生变化,而'used': 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'}]

【问题讨论】:

  • 大量数据使这个问题很难回答。你能更好地格式化它,或者给你的数据一个更短的例子,并显示你想要的相应结果吗?
  • 你使用了'inf'的值,那么你想用这个值做什么? , {'used': 'inf', 'unit': 'MB', 'title': u'\u786c\u76d8\u53ca\u5feb\u7167\u5bb9\u91cf'}]}
  • @Blckknght 感谢提醒,我将其重新编辑为更易读的格式。

标签: python list dictionary data-structures


【解决方案1】:

使用列表推导:

[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]

【讨论】:

    【解决方案2】:

    在我看来,答案是:

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

    至少,该代码对我有用。

    【讨论】: