将元组列表转换为具有键的多个dict值的字典

min*_*bro 2 python dictionary python-3.x

我的元组列表:

list = [('WALMART', '601 12th Avenue Northeast',916523), 
('WALMART SHARED', '1953 west brown street',916523)]
Run Code Online (Sandbox Code Playgroud)

想要将元组列表转换为Dictionary,如下所示:

dict =
    {
        916523: [{
                'cancmpname': 'WALMART',
                'canaddress': '601 12th Avenue Northeast',
            },
            {
                'cancmpname': 'WALMART SHARED',
                'canaddress': '1953 west brown street',

            },
        ]
    }
Run Code Online (Sandbox Code Playgroud)

我的代码到目前为止:

dict = {}
for result in list:
      dict[result[2]]={}
      dict[result[2]]['cmpname']=result[0]
      dict[result[2]]['cmpaddress']=result[1]
Run Code Online (Sandbox Code Playgroud)

这会将列表转换为具有最新值的字典,但不会将结果作为字典数组值附加

我的代码的结果:

dict =
    {
        916523: {
                'cancmpname': 'WALMART SHARED',
                'canaddress': '1953 west brown street',

            }

    }
Run Code Online (Sandbox Code Playgroud)

Aja*_*234 5

你可以使用itertools.groupby:

import itertools
l = [('WALMART', '601 12th Avenue Northeast',916523), ('WALMART SHARED', '1953 west brown street',916523)]
final_data = {a:[dict(zip(['cancmpname', 'canaddress'], i[:-1])) for i in b] for a, b in itertools.groupby(l, key=lambda x:x[-1])}
Run Code Online (Sandbox Code Playgroud)

输出:

{916523: [{'canaddress': '601 12th Avenue Northeast',
       'cancmpname': 'WALMART'},
      {'canaddress': '1953 west brown street',
       'cancmpname': 'WALMART SHARED'}]}
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 5

您可以使用collections.defaultdictO(n) 解决方案。

from collections import defaultdict

lst = [('WALMART', '601 12th Avenue Northeast',916523), 
       ('WALMART SHARED', '1953 west brown street',916523)]

d = defaultdict(list)

for name, address, code in lst:
    d[code].append({'cancmpname': name, 'canaddress': address})
Run Code Online (Sandbox Code Playgroud)

结果

defaultdict(list,
            {916523: [{'canaddress': '601 12th Avenue Northeast',
                       'cancmpname': 'WALMART'},
                      {'canaddress': '1953 west brown street',
                       'cancmpname': 'WALMART SHARED'}]})
Run Code Online (Sandbox Code Playgroud)

解释

  • 难道不是名称类别后的变量,例如使用lst代替listd而不是dict
  • 对于 中的每个项目lst,构建一个字典并附加与代码相同的键。

基准测试

lst = [('WALMART', '601 12th Avenue Northeast',916523), 
       ('WALMART SHARED', '1953 west brown street',916523)]

def jpp(lst):
    d = defaultdict(list)
    for name, address, code in lst:
        d[code].append({'cancmpname': name, 'canaddress': address})
    return d

def ajax(l):
    return {a:[dict(zip(['cancmpname', 'canaddress'], i[:-1])) for i in b] for a, b in itertools.groupby(l, key=lambda x:x[-1])}

lst = lst*1000

%timeit jpp(lst)    # 696 µs per loop
%timeit ajax(lst)   # 3.68 ms per loop
Run Code Online (Sandbox Code Playgroud)