python 多次分组 group by 嵌套字典(nested dict)

需求:在日常开发中,经常会遇到对某一可迭代序列多维度分组,得到按照维度先后的嵌套字典,例如,得到整个MySQL的information_schema.columns表中的所有数据,像动态生成和表对应的类,简化持久化的操作。之中就需要对每个columns里的数据进行db和table两个维度分组,把在同db且同table的数据组合在一起。


举个更简单的例子:


itertools.permutations(range(4), 3) # 0,1,2三个数字排列组合


现在需要把组合中第一位一样的数据分组后,再把得到的结果中第三位一样的数据再分组,得到嵌套的字典。

直接给出解决方案:


def group2nesteddict(iterable, keys, idx=0):
''' group iterable to nested dict by keys ,
nested deep depend keys length

@param keys: functions for group
@return: defaultdict

>>> import itertools
>>> group2nesteddict(itertools.permutations(range(4), 3), [lambda x:x[0], lambda x:x[2]])
defaultdict(<type 'list'>
, {0: defaultdict(<type 'list'>,{1: [(0, 2, 1), (0, 3, 1)]
, 2: [(0, 1, 2), (0, 3, 2)]
, 3: [(0, 1, 3), (0, 2, 3)]}),
1: defaultdict(<type 'list'>,{0: [(1, 2, 0), (1, 3, 0)]
, 2: [(1, 0, 2), (1, 3, 2)]
, 3: [(1, 0, 3), (1, 2, 3)]}),
2: defaultdict(<type 'list'>,{0: [(2, 1, 0), (2, 3, 0)]
, 1: [(2, 0, 1), (2, 3, 1)]
, 3: [(2, 0, 3), (2, 1, 3)]}),
3: defaultdict(<type 'list'>,{0: [(3, 1, 0), (3, 2, 0)]
, 1: [(3, 0, 1), (3, 2, 1)]
, 2: [(3, 0, 2), (3, 1, 2)]})})
'''

x = reduce(lambda d, x:d.append_2_value_collection(keys[idx](x), x), iterable, GroupDict())
if idx != len(keys) - 1:
for k, v in x.items():
x[k] = group2nesteddict(v, keys, idx + 1)
return x


GroupDict 请关注本博客:[url="http://lionkingzw-hotmail-com.iteye.com/blog/1572519"]python 可分组字典[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值