如何通过部分键组成一个组,其中键由多个元组组成,我们希望除第一个键之外的所有组都进行分组。例如:
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应用于这个结构,其中键可以由多个元组组成。
答案 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)
我不确定你最初是怎么做的,因为你没有发布你用来进行分组的代码,但这应该可以解决问题。