2013-11-27 53 views
1

我有一个名为node_names的计算机节点列表,我想要查找每个节点中的可用RAM的数量,并将其存储在第二个列表中。然后我想将这些列表组合成一个字典。Python:将函数输出结合到字符串,然后结合到字典中

我:

for i in range(0, number_of_nodes): 
    sys_output = [commands.getoutput('ssh %s \'free -m\'' % node_names[i])] 
    free_memory = [x.split()[9] for x in sys_output] 
    print free_memory 

对于4个节点,这将返回[mem1],[mem2],[mem3],[mem4]

如何将每个内存值组合到一个列表中?我很难分配free_memory作为列表,而不是在每次循环迭代后替换的字符串。

一旦我有了一个内存列表,我应该可以将它与node_names列表结合起来,制作一个字典文件并进行任何必要的排序。

+0

'memout'从哪里来?应该是'sys_output'? – korylprince

+0

你想要的是[[mem1,mem2,mem3,mem4]'?作为一个列表? – ecampver

+0

是的,我试图稍微澄清名称时忘记更改名称。我希望列表中的每个mem都是yes,所以我可以将它添加到节点名称中,并且对于所有4个节点都具有node_name:free_memory。 – keipertk

回答

2

我建议干脆直接建词典:

import commands 

node_free_mem = {} 

for n in node_names: 
    sys_output = commands.getoutput("ssh %s 'free -m'" % n) 
    free_memory = sys_output.split()[9] 
    node_free_mem[n] = int(free_memory) 

这里的代码,不正是你问:它建立一个列表,然后使用该列表,字典。讨论后的代码。

import commands 

def get_free_mem(node_name): 
    sys_output = commands.getoutput('ssh %s \'free -m\'' % node_name) 
    free_memory = sys_output.split()[9] 
    return int(free_memory) 

free_list = [get_free_mem(n) for n in node_names] 
node_free_mem = dict(zip(node_names, free_list)) 

注意,这两个代码示例中,我只是遍历节点名称的列表,而不是使用range()拿到索引号和索引列表。在Python中最简单最好的办法就是询问你想要什么:你想要的名字,所以要求那些。

我做了一个帮助函数,获取可用内存的代码。然后,一个简单的列表理解建立一个可用内存值的并行列表。

唯一棘手的是构建字典。这种使用的zip()实际上是相当常见的Python和在这里讨论:

Map two lists into a dictionary in Python

对于在Python 2.x的大名单,你可能想使用itertools.izip(),而不是内置zip(),但在Python 3 .x你只需使用内置的zip()

编辑:清理代码;它应该现在工作。

commands.getoutput()返回一个字符串。没有必要在列表中打包字符串,所以我删除了方括号。然后反过来,不需要列表理解来获得free_memory值;只是分割字符串。现在我们有一个简单的字符串,可以传递给int()来转换为整数。

+0

这非常有帮助,非常感谢。我在线上只有一个问题:node_free_mem [n] = int(free_memory) “int()参数必须是字符串或数字,而不是'list'” 是否有其他方法来强制这些条目是整数? – keipertk

+0

对不起。我应该测试代码。我会编辑它以使其正确。 – steveha

+0

太棒了!感谢您的时间。 – keipertk