我有一个python对象,它是一个关键字的字典,主机名和值是用户列表和它们的磁盘使用情况。由于解释似乎令人困惑,我在下面粘贴了我的词典。每个主机都是一个密钥,在每个主机下可能有几个用户在主机中很常见,也可能是唯一的。我正在努力检查以下条件。
到目前为止: 1.登录每台主机 2.获取用户及其磁盘使用情况 3.结果存储在一个dict中,主机名作为键,值是用户及其磁盘使用情况的列表。
如果我能把它作为dict的词典,我希望我的问题得到解决。
{
'localhost': [
'alice: 1491916K',
'bob: 423576K'
],
'10.252.136.241': [
'alice: 3491916K',
'bob: 4235K',
'chaplin: 3456K'
]
}
这是来自2台主机的示例输出。现在我有结果对象,它是上面形式的dict。我想迭代到每个主机,看看每个主机中是否存在用户'alice'并添加他的磁盘空间并在dice中为'alice'设置了一个条目,对于'bob'有相同的条目然后离开'chaplin' '正如新词典中那样。我不想要特定主机。我想在最后总使用量。
我只是坚持迭代。我可以设法总结并创建'user'的大字典:'total_space'一旦我可以迭代。
[UPDATE] 我的预期输出是
expected_output = { 'alice': '498382K', 'bob': '427811K', 'chaplin': '3456K' }
下面。每个主机都添加了alice的使用。同样适用于bob和chaplin,因为他并不存在于所有主机中。
答案 0 :(得分:1)
对于此任务,您可以使用regex和itertools.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}
答案 1 :(得分: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
如果您希望按照磁盘使用率的降序对结果进行排序,请为reverse=True
函数设置sorted
。
答案 2 :(得分:0)
<强>提示强>
这是一种天真的算法实现,可以将list
转换为dict
,期望您显示的格式。
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'}
答案 3 :(得分: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)]
答案 4 :(得分: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'}}