从python中的列表dict创建dict of dict

2024-05-23 15:41:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python对象,它是一个dict,键是主机名,值是一个用户列表,用dicts表示他们的磁盘使用情况。我把我的口述贴在下面,因为解释似乎很混乱。主机下可能有多个唯一的主机,每个主机下可能有多个用户。我正在努力检查以下情况。在

  1. 检查每个主机中是否存在该用户。在
  2. 如果是,请加上他在每个主机上使用的磁盘总数。在
  3. 如果没有,请将唯一用户附加到dict
  4. 现在在大字典中,按照磁盘使用的顺序对用户进行排序。在

目前已实现: 1登录到每个主机 2获取用户及其磁盘使用情况 三。结果以主机名作为键存储在dict中,值是用户及其磁盘使用情况的列表。在

如果我能把这件事写下来,我希望我的问题能解决。在

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

这是来自2个主机的示例输出。现在我有了result对象,它是上面形式的dict。我想迭代到每个主机,看看用户“alice”是否存在于每个主机中,添加他的磁盘空间,并在dict中为“alice”和“bob”添加一个条目,然后将“chaplin”保留为新dict中的状态。我不希望特定于主机。最后我要一个完整的用法。在

我只是停留在迭代上。一旦我可以迭代,我就可以成功地总结并创建“user”这个大词条:“total_space”。在

[更新] 我的预期产出是

^{pr2}$

这里。在每个主机中都添加了alice的用法。鲍伯和卓别林也是这样,因为他不在所有的东道主面前。在


Tags: 对象用户用法列表情况dict磁盘主机名
3条回答
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))

会给你这个输出

^{pr2}$

如果要按磁盘使用量的降序对结果进行排序,请为sorted函数设置reverse=True。在

对于此任务,您可以组合使用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])})

输出:

^{pr2}$

提示

这是将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'}

相关问题 更多 >