2016-12-20 231 views
2

我有一個python對象,這是一個密鑰字典的主機名和值是用戶列表和他們的磁盤用法在字典的表示法。由於解釋似乎令人困惑,我在下面粘貼了字典。每個主機都是一個密鑰,每個主機下可能有多個用戶,這些用戶在主機中很常見,並且可能也是唯一的。我正在努力檢查以下條件。從python列表的字典創建字典的字典

  1. 檢查每個主機是否存在該用戶。
  2. 如果是,請在每個主機中添加他正在使用的總磁盤。
  3. 如果沒有,請將唯一用戶附加到字典中。
  4. 現在在大字典中按照磁盤使用順序對用戶進行排序。

迄今取得: 1.登錄到每個 2.獲取用戶和他們的磁盤使用情況 3.結果存儲在主機名的密鑰和值的字典的主機是用戶的列表及其磁盤使用情況。

如果我可以將其作爲字典的字典,我希望我的問題得到解決。

{ 
'localhost': [ 
    'alice: 1491916K', 
    'bob: 423576K' 
], 
'10.252.136.241': [ 
    'alice: 3491916K', 
    'bob: 4235K', 
    'chaplin: 3456K' 
] 
} 

這是2臺主機的輸出示例。現在我有了以上形式的字典結果對象。我想迭代到每個主機,看看用戶'alice'是否存在於每個主機中,並添加他的磁盤空間,並在'alice'字典中有一個單獨的條目,'bob'也是一樣,然後離開'chaplin '就像在新的字典中一樣。我不希望主機具體。我希望最終的總使用量。

我只是在迭代。我可以總結並創建「用戶」的大字典:'total_space',一旦我可以迭代。

[UPDATE] 我的期望輸出是

expected_output = { 'alice': '498382K', 'bob': '427811K', 'chaplin': '3456K' } 

這裏。愛麗絲的使用正在被添加到每個主機中。因爲他並不是在所有的主人身上,所以只是追加了bob和chaplin。

+1

請顯示您所需的輸出示例。 –

+0

@DanielRoseman在問題更新中添加了我的預期輸出。 Thx – Medhamsh

+0

好吧,迭代不再是最難的事了;現在你似乎也想把這些值解析爲整數並對它們進行求和。 –

回答

1
given_dict = { 
    'localhost': ['alice: 1491916K', 'bob: 423576K'], 
    '10.252.136.241': ['alice: 3491916K', 'bob: 4235K', 'chaplin: 3456K'] 
} 
resultant_dict = {} 

for values in given_dict.values(): 
    for value in values: 
     name, usage = value.split(':') 
     usage = int(usage.strip().rstrip('K')) 
     if name in resultant_dict: 
      resultant_dict[name] += usage 
     else: 
      resultant_dict[name] = usage 

sorted_result = sorted(resultant_dict.items(), key=lambda x: x[1]) 
for name, usage in sorted_result: 
    print("{}: {}".format(name, usage)) 

會給你這個輸出

chaplin: 3456 
bob: 427811 
alice: 4983832 

如果你正在尋找的結果磁盤使用情況從高到低的順序進行排序,對於sorted設置reverse=True功能。

0

提示

這是一種用於算法幼稚的做法果然中dictlist期待你顯示的格式。

In [21]: def dictify(l): 
    ...:  d = dict() 
    ...:  for x in l: 
    ...:   key, val = [y.strip() for y in x.split(':')] 
    ...:   d[key] = val 
    ...:  return d 
In [22]: dictify(data['localhost']) 
Out[22]: {'alice': '1491916K', 'bob': '423576K'} 
+0

非常感謝。我仍然沒有做一個列表理解來列出所有的字典,這個想法是進一步使用集合。在所有的字典中計算和總結相應的鍵的值,並且製作一個字典。 – Medhamsh

1

對於這個任務,你可以使用這些工具組合regexitertools.groupby

values = { 
'localhost': [ 
    'alice: 1491916K', 
    'bob: 423576K' 
], 
'10.252.136.241': [ 
    'alice: 3491916K', 
    'bob: 4235K', 
    'chaplin: 3456K' 
] 
} 
import re 
import itertools 

numbers = re.compile(r'\d+') 

parsed_list = [(el.split(': ')[0], int(numbers.findall(el)[0])) for k, v in values.items() for el in v] 

print({k: sum([el[1] for el in v]) for k, v in itertools.groupby(sorted(parsed_list), key=lambda x: x[0])}) 

輸出:

{'alice': 4983832, 'bob': 427811, 'chaplin': 3456} 
0

你可以這樣做:

import re 

dic = { 
    'localhost': [ 
     'alice: 1491916K', 
     'bob: 423576K' 
    ], 
    '10.252.136.241': [ 
     'alice: 3491916K', 
     'bob: 4235K', 
     'chaplin: 3456K' 
    ], 
} 

users = {} 
# down we are unpacking all the names/vals of (['alice', ' 3491916K'], ['bob', ' 4235K'], ['chaplin', ' 3456K'], ['alice', ' 1491916K'], ['bob', ' 423576K']) 
for name, val in (j.split(':') for x in dic.values() for j in x): 
    users[name] = users.get(name, 0) + int(re.findall('\d+', val)[0]) 

print(users) # {'chaplin': 3456, 'alice': 4983832, 'bob': 427811} 
sort_users = sorted(users.items(), key=lambda x: x[1], reverse=True) 
print(sort_users) # [('alice', 4983832), ('bob', 427811), ('chaplin', 3456)] 
0
data={ 
'localhost': [ 
    'alice: 1491916K', 
    'bob: 423576K' 
], 
'10.252.136.241': [ 
    'alice: 3491916K', 
    'bob: 4235K', 
    'chaplin: 3456K' 
] 
} 

res=[] 
k=data.values() 
for elm in k: 
    res1={} 
    for x in elm: 
     res1[(x.split(':'))[0]]=x.split(':')[1] 
    res.append(res1) 

print dict(zip(data.keys(), res)) 

輸出:

{'10.252.136.241': {'chaplin': ' 3456K', 'bob': ' 4235K', 'alice': ' 3491916K'}, 'localhost': {'bob': ' 423576K', 'alice': ' 1491916K'}}