【发布时间】:2016-04-07 14:46:25
【问题描述】:
这个问题是上一个问题的延伸:rebuild python array based on common elements - 但不同之处足以保证一个新问题:
我已经为此苦苦挣扎了一段时间。我的数据是来自 sql 查询的字典数组。数组中的每个元素都代表一个货件,根据keys有共同的值。
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()])
但我似乎无法在输出数组中获得第二级 - 分组 b PartNum 键。通过一些研究,我认为我需要做的是使用defaultdict 作为外部`defaultdict'的类型,如下所示:
d = defaultdict(defaultdict(list))
因为 defaultdict 返回一个函数而引发错误,所以我需要使用lambda(是吗?)
d = defaultdict(lambda:defaultdict(list))
for item in data:
d[item['CustName']].append(item) <----this?
我的问题是如何“访问”循环中的第二级数组并告诉“内部”默认字典要分组的内容(PartNum)?数据来自数据库程序员,项目不断发展以添加越来越多的数据(键),所以我希望这个解决方案尽可能通用,以防更多数据被我扔掉。我希望能够根据我需要去的级别来“链接”defaultdicts。我边走边学,所以我在努力理解lambda 和defaultdict 类型的基础知识以及从这里到哪里去。
【问题讨论】:
-
排序字典然后应用groupby。或者如果可以的话,事先用 SQL 来做。我现在帮不了你了,我在用手机……
-
一个
PartNum可以有两个具有相同数字/值的delKey吗? -
您的实际
data中有多少项? -
原始数据集中可能有数万个。
-
您是否关心输出中列表中值的顺序?如果没有,您可以轻松摆脱这些级别,并使您的结构只是一组嵌套的字典。
Tree = lambda: defaultdict(Tree)是这种结构所需的全部设置。
标签: python arrays defaultdict