【问题标题】:create a dict of dict from dict of lists in python从python中的列表字典创建字典字典
【发布时间】:2017-05-05 13:44:26
【问题描述】:

我有一个 python 对象,它是一个字典,键是主机名,值是用户列表,以及他们在字典符号中的磁盘使用情况。我在下面粘贴了我的字典,因为解释似乎令人困惑。每个主机都是一个键,在每个主机下可能有几个用户,这些用户在主机中是常见的,也可能是唯一的。我正在努力检查以下条件。

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

目前取得的成就: 1.登录各个主机 2. 获取用户及其磁盘使用情况 3. 结果存储在以主机名作为键的字典中,值是用户及其磁盘使用情况的列表。

如果我能把它变成 dict 的 dict,我希望我的问题得到解决。

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

这是来自 2 台主机的示例输出。现在我有结果对象,它是上述形式的字典。我想迭代到每个主机,查看每个主机中是否存在用户“爱丽丝”并添加他的磁盘空间,并在“爱丽丝”的字典中有一个条目,“鲍勃”也是如此,然后离开“卓别林” ' 就像在新的字典中一样。我不想要特定的主机。我想要最后的总使用量。

我只是停留在迭代。一旦我可以迭代,我就可以设法总结并创建 'user': 'total_space' 的大字典。

[更新] 我的预期输出是

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

这里。在每个主机中都添加了 alice 的使用。鲍勃和卓别林也是一样的,因为他不在所有主持人中。

【问题讨论】:

  • 请展示您所需输出的示例。
  • @DanielRoseman 在问题更新中添加了我的预期输出。谢谢
  • 嗯,迭代不再是最难的事情了;现在您似乎还想将值解析为整数并将它们求和。

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


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

      提示

      这是算法的幼稚实现,它将 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'}
      

      【讨论】:

      • 非常感谢。我仍然没有做一个列表理解来制作所有字典的列表,我的想法是进一步使用 collections.Counter 并总结所有字典中相应键的值并制作一个字典。
      【解决方案4】:
      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'}}
      

      【讨论】:

        【解决方案5】:

        你可以这样做:

        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)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-06
          • 2014-11-11
          • 1970-01-01
          • 2021-06-25
          • 2014-10-02
          • 2016-11-20
          • 2019-02-13
          相关资源
          最近更新 更多