2013-11-27 83 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