字典列表到Python中的嵌套字典列表

我有这样的input_data

input_data = [
        {'vehicle': '001','store': 'foo1','qty': 100},{'vehicle': '001','qty': 200},'store': 'baz1','qty': 300},'qty': 400},{'vehicle': '002','store': 'foo2','qty': 500},'store': 'baz2','qty': 600},'qty': 700}]

在Python中获得out_put数据的最佳方法是如下所示:

output_data = [{'vehicle': '001','store': [{'store': 'foo1','qty': [100,200]},{'store': 'baz1','qty': [300,400]},]
            },'store': [{'store': 'foo2','qty': [500]},{'store': 'baz2','qty': [600,700]},]
            }]
shanchuang2006 回答:字典列表到Python中的嵌套字典列表

您可以尝试一下,我敢肯定有一种优雅的方法,但目前还无法解决:

import pandas as pd

input_data = [
        {'vehicle': '001','store': 'foo1','qty': 100},{'vehicle': '001','qty': 200},'store': 'baz1','qty': 300},'qty': 400},{'vehicle': '002','store': 'foo2','qty': 500},'store': 'baz2','qty': 600},'qty': 700}]
df = pd.DataFrame(pd.DataFrame(input_data).groupby(['vehicle','store'])['qty'].apply(list))
dct = df.groupby(level=0).apply(lambda df: df.xs(df.name)['qty'].to_dict()).to_dict()
final_list = []
for k in dct:
    temp_dct = {}
    temp_dct['vehicle'] = k
    temp_l = [dict(zip(['store','qty'],[key,v])) for key,v in dct[k].items()]
    temp_dct['store'] = temp_l
    final_list.append(temp_dct)
print(final_list)

输出:

[{'vehicle': '001','store': [{'qty': [300,400],'store': 'baz1'},{'qty': [100,200],'store': 'foo1'}]},'store': [{'qty': [600,700],'store': 'baz2'},{'qty': [500],'store': 'foo2'}]}]
,

您可以使用itertools.groupbyoperator.itemgetter

names = v,s,q = 'vehicle','store','qty'
v_key,s_key,q_key = map(itemgetter,names)
output_data = [{v: {s: [{s: sk,q: list(map(q_key,sv))}
                            for sk,sv in groupby(vv,s_key)]}}
                            for vk,vv in groupby(input_data,v_key)]

结果:

[{'vehicle': {'store': [{'qty': [100,'store': 'foo1'},{'qty': [300,'store': 'baz1'}]}},{'vehicle': {'store': [{'qty': [500],'store': 'foo2'},{'qty': [600,'store': 'baz2'}]}}]
,

使用内置itertools - groupby method的一种方法:

# Input data
input_data = [
        {'vehicle': '001','qty': 700}]

# Main code
from itertools import groupby # For grouping a dataset

data = groupby(input_data,key = lambda x: x['vehicle']) # Grouping vehicles

final_data = []
for i in data:
    inner = {}
    outer = {}
    for j in list(i[1]):
        inner.setdefault(j['store'],[]).append(j['qty'])
    outer["vehicle"] = i[0]
    outer["store"] = [{"store":i,"qty": j} for i,j in inner.items()]
    final_data.append(outer)

print (final_data)

# Output
# {'vehicle': '001','store': [{'store': 'foo1','qty': [100,200]},{'store': 'baz1','qty': [300,400]}]},'store': [{'store': 'foo2','qty': [500]},{'store': 'baz2','qty': [600,700]}]}]

我希望这对您有所帮助!

,

下面的代码产生预期的输出:

result_list = [] def check_duplicate(车辆名称):     对于索引,d枚举(结果列表):         如果d.get(“ vehicle”)== vehicle_name:             返回True,索引         对于store_index,枚举(d.get(“ store”))中的store_value:             如果store_value.get(“ store”)== vehicle_name:                 返回True,store_index

return False,None

对于input_data中的数据:

if isinstance(data,dict) and  data.has_key("vehicle"):
    #print data
    result= check_duplicate(data.get('vehicle'))
    if not result[0]:
        result_list.append({'vehicle':data.get('vehicle'),'store':[{'store':data.get('store'),'qty': [data.get('qty')]}]})

    if result[0]:
        print "check if store is already present"
        store_check= check_duplicate(data.get('store'))

        if store_check[0]:
            result_list[result[1]].get("store")[store_check[1]].get("qty").append(data.get('qty'))
        if not store_check[0]:
            result_list[result[1]].get("store").append({'store':data.get('store'),'qty': [data.get('qty')]})

打印result_list

本文链接:https://www.f2er.com/3111442.html

大家都在问