2016-12-20 303 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'}}