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)
你可以使用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)
您可以使用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代替list,d而不是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)