【问题标题】:Convert a list of lists to dictionary [duplicate]将列表列表转换为字典 [重复]
【发布时间】:2019-11-27 06:46:08
【问题描述】:

我有一个包含六个列表的列表

lst = [
    ['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All'],
    ['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All'],
    ['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App'],
    ['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App'],
    ['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App'],
    ['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App']
]

我正在尝试将其转换为

{
    "2.2.5": ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.5',
              '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.5',
              '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5'],
    "2.2.6": ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.6',
              '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.6',
              '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.6']
}

到目前为止,这是我所做的:

to_dict = {key[0]: [value[1] + '/' + value[0] for value in lst] for key in lst}

这会返回

{'2.2.5': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.5',
           '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.6',
           '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.5',
           '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.6',
           '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5',
           '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.6'],
 '2.2.6': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.5',
           '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.6',
           '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.5',
           '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.6',
           '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5',
           '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.6']}

内部循环从索引1lst 添加所有内容。我应该如何添加适合其键的值?

【问题讨论】:

  • 啊!在 Google 中搜索时应该使用元组
  • dct = dict((a[0], [b[1]+'/'+a[0] for b in lst if b[0] == a[0]]) for a in lst)
  • @AniketSahrawat 你能添加这个作为答案吗?这是一个很好的实现

标签: python


【解决方案1】:

你可以这样做。

lst = [
['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All'],
['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All'],
['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App'],
['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App'],
['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App'],
['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App']
]
from collections import defaultdict
c=defaultdict(list)
[c[i].append(j) for i,j in lst]
print c

输出: defaultdict(<type 'list'>, {'2.2.5': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App'], '2.2.6': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App']})

【讨论】:

    【解决方案2】:

    使用defaultdictdict.setdefault() 方法:

    lst = [
        ['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All'],
        ['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All'],
        ['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App'],
        ['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App'],
        ['2.2.5', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App'],
        ['2.2.6', '/usr/local/share/dotnet/shared/Microsoft.NETCore.App']
    ]
    
    out = {}
    for k, v in lst:
        out.setdefault(k, []).append(v + '/' + k)
    
    from pprint import pprint
    pprint(out, width=30)
    

    打印:

    {'2.2.5': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.5',
               '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.5',
               '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5'],
     '2.2.6': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/2.2.6',
               '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/2.2.6',
               '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.6']}
    

    【讨论】:

      【解决方案3】:

      您可以将列表元素作为键值进行迭代(python 进行解包),并使用 dict.setdefault 将值列表设置为空并附加到列表中:

      In [77]: out = {}                                                                                                                                                                                           
      
      In [78]: for k, v in lst: 
          ...:     out.setdefault(k, []).append(v) 
          ...:                                                                                                                                                                                                    
      
      In [79]: out                                                                                                                                                                                                
      Out[79]: 
      {'2.2.5': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All',
        '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App',
        '/usr/local/share/dotnet/shared/Microsoft.NETCore.App'],
       '2.2.6': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All',
        '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App',
        '/usr/local/share/dotnet/shared/Microsoft.NETCore.App']}
      

      collections.defaultdictlist 工厂:

      In [80]: out = collections.defaultdict(list)                                                                                                                                                                
      
      In [81]: for k, v in lst: 
          ...:     out[k].append(v) 
          ...:      
          ...:                                                                                                                                                                                                    
      
      In [82]: out                                                                                                                                                                                                
      Out[82]: 
      defaultdict(list,
                  {'2.2.5': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All',
                    '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App',
                    '/usr/local/share/dotnet/shared/Microsoft.NETCore.App'],
                   '2.2.6': ['/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All',
                    '/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App',
                    '/usr/local/share/dotnet/shared/Microsoft.NETCore.App']})
      

      要将键字符串附加到值,请使用 f-strings 或 str.format(在不支持 f-strings 的版本上):

      对于dict.setdefault

      out.setdefault(k, []).append(f'{v}/{k}')
      out.setdefault(k, []).append('{v}/{k}'.format(v=v, k=k))
      

      对于collections.defaultdict

      out[k].append(f'{v}/{k}')
      out[k].append('{v}/{k}'.format(v=v, k=k))
      

      【讨论】:

      • 这两种方法之间是否有任何性能?
      • @Akshay 都是用 C 实现的,但是后者导入了一个模块。
      猜你喜欢
      • 2020-03-19
      • 2016-08-29
      • 2020-11-11
      • 2011-10-17
      • 2017-10-01
      • 1970-01-01
      • 2018-02-08
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多