我有一个列表-memory_per_instance-如下所示:

[
  {
    'mem_used': '14868480',
    'rsrc_name': 'node-5b5cf484-g582f'
  },
  {
    'mem_used': '106618880',
    'rsrc_name': 'infrastructure-656cf59bbb-xc6bb'
  },
  {
    'mem_used': '27566080',
    'rsrc_name': 'infrastructuret-l6fl'
  },
  {
    'mem_used': '215556096',
    'rsrc_name': 'node-62lnc'
  }
]

现在,我们可以看到有两个资源组nodeinfrastructure
我想创建一个数组,其中最终产品包含资源的名称(nodeinfrastructure),而mem_usedmem_used的总和。
我已经可以用regex区分这两个组了。
从现在开始,我如何创建一个数组-memory_per_group-结果如下
[
  {
    'mem_used': '230424576',
    'rsrc_name': 'node'
  },
  {
    'mem_used': '134184960',
    'rsrc_name': 'infrastructure'
  },
]

我可以将rsrc的名称存储在一个tmp变量中,如下所示:
memory_per_pod_group = []
for item in memory_per_pod_instance:
    tmp_rsrc = item['rsrc_name']
    if(item['rsrc_name'] == tmp_rsrc):
        memory_per_pod_group.append({'rsrc_name':get_group(tmp_rsrc, pod_hash_map), 'mem_used':mem_used})
        memory_per_pod_instance.remove(item)
pprint.pprint(memory_per_pod_group)

但之后,我会在列表中迭代一段不可忽略的时间。
有没有办法提高效率?

最佳答案

好吧,当然。您只需要一次迭代:

      data = [
    {
        'mem_used': '14868480',
        'rsrc_name': 'node-5b5cf484-g582f'
    },
    {
        'mem_used': '106618880',
        'rsrc_name': 'infrastructure-656cf59bbb-xc6bb'
    },
    {
        'mem_used': '27566080',
        'rsrc_name': 'infrastructuret-l6fl'
    },
    {
        'mem_used': '215556096',
        'rsrc_name': 'node-62lnc'
    }
]

def get_group(item):
    rsrc_name = item['rsrc_name']
    index = rsrc_name.index('-');
    return rsrc_name[0:index]

def summary(list):
    data = {};
    for item in list:
        group = get_group(item)

        if not (group in data):
            data[group] = 0

        data[group] += int(item['mem_used'])

    result = []
    for rsrc_name, mem_used in data.items():
        result.append({ 'rsrc_name': rsrc_name, 'mem_used': str(mem_used) })

    return result

if __name__ == '__main__':
    print(summary(data))

结果:
[{'mem_used': 230424576, 'rsrc_name': 'node'}, {'mem_used': 106618880, 'rsrc_name': 'infrastructure'}, {'mem_used': 27566080, 'rsrc_name': 'infrastructuret'}]

注意,get_group对于您的用例来说可能太简单了结果有三个组,因为其中一个资源的key'infrastructuret'结尾有一个“t”。

09-18 19:01