我有一个名为node_names的计算机节点列表,我想在每个节点中找到空闲ram的数量,并将其存储在第二个列表中。然后我想将这些列表组合成字典。
我有:
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 :(得分: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()
以转换为整数。