Python:将函数输出与字符串相关联,然后组合成字典

时间:2013-11-27 03:29:31

标签: python list dictionary

我有一个名为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列表结合起来制作一个字典文件并进行任何必要的排序。

1 个答案:

答案 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()以转换为整数。