这个问题是之前一个问题的延伸:rebuild python array based on common elements - 但是不同之处足以需要一个新问题:
我已经苦苦挣扎了一段时间。我的数据是来自SQL查询的字典数组。数组中的每个元素都代表一批货物,并且基于键有共同的值。
我想要的输出是按照特定键分组的。
我的问题是如何在循环中“访问”第二级数组并告诉“内部”的defaultdict按照什么分组(PartNum)? 数据来自数据库程序员,项目不断发展以添加更多数据(键),因此我希望此解决方案尽可能通用,以防更多数据被抛到我的面前。 我希望能够“链接”defaultdicts,具体取决于需要多少级别。 我正在学习过程中,因此正在努力理解lambda和defaultdict类型的基础知识以及从哪里开始。
我已经苦苦挣扎了一段时间。我的数据是来自SQL查询的字典数组。数组中的每个元素都代表一批货物,并且基于键有共同的值。
data = [
{"CustName":"customer1", "PartNum":"part1", "delKey":"0001", "qty":"10", "memo":"blah1"},
{"CustName":"customer1", "PartNum":"part1", "delKey":"0002", "qty":"10", "memo":"blah2"},
{"CustName":"customer1", "PartNum":"part1", "delKey":"0003", "qty":"10", "memo":"blah3"},
{"CustName":"customer2", "PartNum":"part3", "delKey":"0004", "qty":"20", "memo":"blah4"},
{"CustName":"customer2", "PartNum":"part3", "delKey":"0005", "qty":"20", "memo":"blah5"},
{"CustName":"customer3", "PartNum":"partXYZ", "delKey":"0006", "qty":"50", "memo":"blah6"},
{"CustName":"customer3", "PartNum":"partABC", "delKey":"0007", "qty":"100", "memo":"blah7"}]
我想要的输出是按照特定键分组的。
dataOut = [
{"CustName":"customer1", "Parts":[
{"PartNum":"part1", "deliveries":[
{"delKey":"0001", "qty":"10", "memo":"blah1"},
{"delKey":"0002", "qty":"10", "memo":"blah2"},
{"delKey":"0003", "qty":"10", "memo":"blah3"}]}]},
{"CustName":"customer2", "Parts":[
{"PartNum":"part3", "deliveries":[
{"delKey":"0004", "qty":"20", "memo":"blah4"},
{"delKey":"0005", "qty":"20", "memo":"blah5"}]}]},
{"CustName":"customer3", "Parts":[
{"PartNum":"partXYZ", "deliveries":[
{"delKey":"0006", "qty":"50", "memo":"blah6"}]},
{"PartNum":"partABC", "deliveries":[
{"delKey":"0007", "qty":"100", "memo":"blah7"}]}]}]
我可以使用defaultdict和列表推导式来获取单层分组,就像上一个问题提供的那样,并稍作修改。
d = defaultdict(list)
for item in data:
d[item['CustName']].append(item)
print([{'CustName': key, 'parts': value} for key, value in d.items()])
但我无法在输出数组中获得第二层,也就是通过PartNum
键进行分组。通过一些研究,我认为我需要将外部`defaultdict'的类型设置为defaultdict
,如下所示:
d = defaultdict(defaultdict(list))
由于defaultdict返回一个函数,所以会出现错误,因此我需要使用lambda
(是吗?)
d = defaultdict(lambda:defaultdict(list))
for item in data:
d[item['CustName']].append(item) <----this?
我的问题是如何在循环中“访问”第二级数组并告诉“内部”的defaultdict按照什么分组(PartNum)? 数据来自数据库程序员,项目不断发展以添加更多数据(键),因此我希望此解决方案尽可能通用,以防更多数据被抛到我的面前。 我希望能够“链接”defaultdicts,具体取决于需要多少级别。 我正在学习过程中,因此正在努力理解lambda和defaultdict类型的基础知识以及从哪里开始。
PartNum
中是否可以有两个具有相同编号/值的delKey
? - wwiidata
中有多少项? - wwiiTree = lambda: defaultdict(Tree)
就是你需要设置这种结构的全部内容。 - Blckknght