避免重复太多时间-算法构造

时间:2018-07-21 12:27:22

标签: python algorithm list

我有一个列表-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_used将是{{1 }}。

我已经可以使用正则表达式来区分这两个组。

从现在开始,我如何创建一个数组mem_used-其结果是

memory_per_group

我可以将[ { 'mem_used': '230424576', 'rsrc_name': 'node' }, { 'mem_used': '134184960', 'rsrc_name': 'infrastructure' }, ] 的名称存储在tmp变量中,例如:

rsrc

但是,然后,我将在列表中遍历一个不可忽略的时间。

有没有办法提高效率?

2 个答案:

答案 0 :(得分:1)

好的,当然。您只需要进行一次迭代:

      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对于您的用例而言可能太简单了。由于其中一个资源的键'infrastructuret'的末尾带有“ t”,因此结果分为三组。

答案 1 :(得分:0)

您可以将其遍历一次,然后使用简单的startswith进行检查,然后以简单的增量直接附加到所需的字典键上。

类似

memory_total = { 'node': 0, 'instance': 0 };

for item in memory_per_instance:
    if item['rsrc_name'].startsWith('node'):
        memory_total['node'] += item['mem_used']
    if item['rsrc_name'].startsWith('infrastructure'):
        memory_total['instance'] += item['mem_used']