从python中

时间:2016-12-20 10:57:14

标签: python list python-3.x dictionary iteration

我有一个python对象,它是一个关键字的字典,主机名和值是用户列表和它们的磁盘使用情况。由于解释似乎令人困惑,我在下面粘贴了我的词典。每个主机都是一个密钥,在每个主机下可能有几个用户在主机中很常见,也可能是唯一的。我正在努力检查以下条件。

  1. 检查每个主机中是否存在该用户。
  2. 如果是,请添加他在每个主机中使用的总磁盘。
  3. 如果没有,请将唯一用户附加到词典。
  4. 现在在大字典中按照磁盘使用顺序对用户进行排序。
  5. 到目前为止: 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,因为他并不存在于所有主机中。

5 个答案:

答案 0 :(得分: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}

答案 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'}}
相关问题