按部分键分组字典

时间:2014-01-06 09:36:52

标签: python itertools

如何通过部分键组成一个组,其中键由多个元组组成,我们希望除第一个键之外的所有组都进行分组。例如:

example = {((0, 0), (0, 2)): (-1, 0), ((2, 0), (0, 2)): (1, 0), ((2, 1), (0, 3)): (1,0)}

分组的最终结果:

first_group = {((0, 0), (0, 2)): (-1, 0), ((2, 0), (0, 2)): (1, 0)}
second_group = {((2, 1), (0, 3)): (1,0)}

这里的键是长度2,我们只用键中的第二个元组来搜索。但如果关键是3(n)元组的长度:

{((0, 0), (0, 2), (0, 3)): (-2, 0)}

我希望它按最后两个(n-1)进行分组:

(0, 2), (0, 3)

我查看了this question但我没有运气将itertools.groupby应用于这个结构,其中键可以由多个元组组成。

1 个答案:

答案 0 :(得分:1)

试试这个:

import itertools

example = {((0, 0), (0, 2), (0, 3)): (-2, 0),
           ((1, 3), (0, 2), (0, 3)): (-5, 8),
           ((4, 7), (0, 2), (0, 1)): (3, -2)}
keyfunc = lambda x: x[0][1:] # [0] -> key; [1:] -> all-but-first tuple

items = sorted(example.items(), key=keyfunc)

for key, subiterator in itertools.groupby(items, keyfunc):
    # grouped by this
    print(key)
    for subkey, subvalue in subiterator:
        # but these are the actual things that were grouped
        print(subkey, ':', subvalue) 

结果:

((0, 2), (0, 1)) # <- grouped-by
((4, 7), (0, 2), (0, 1)) : (3, -2)
((0, 2), (0, 3)) # <- grouped-by
((0, 0), (0, 2), (0, 3)) : (-2, 0)
((1, 3), (0, 2), (0, 3)) : (-5, 8)

我不确定你最初是怎么做的,因为你没有发布你用来进行分组的代码,但这应该可以解决问题。