在嵌套有dict和list的列表上执行iter以更改di中的值

2024-05-29 10:41:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个非常大的数据,如下所示,结构可能不固定,但我想找到每个键名是'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'}]

Tags: urladmintitleusageitemblocknumclass
2条回答

在我看来,答案是:

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

至少,那个代码对我有用。你知道吗

使用列表理解:

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

相关问题 更多 >

    热门问题