Python 3.x 如何在具有多个匹配值的列表中对元组进行分组

Python 3.x 如何在具有多个匹配值的列表中对元组进行分组,python-3.x,list,tuples,grouping,Python 3.x,List,Tuples,Grouping,我希望尽可能高效地将具有多个公共值的元组列表分组。我知道做这件事的方法很长,但我想知道做这件事的更快更“Pythonic”的方法是什么 我正在努力实现的目标: lst = [('a', '1', 1), ('a', '1', 2), ('a', '2', 2), ('b', '1', 1), ('c', '1', 1)] result = [ [('a', '1', 1), ('a', '1', 2)],

我希望尽可能高效地将具有多个公共值的元组列表分组。我知道做这件事的方法很长,但我想知道做这件事的更快更“Pythonic”的方法是什么

我正在努力实现的目标:

lst = [('a', '1', 1),
       ('a', '1', 2),
       ('a', '2', 2),
       ('b', '1', 1),
       ('c', '1', 1)]

result = [
        [('a', '1', 1), ('a', '1', 2)],
        [('a', '2', 1)],
        [('b', '1', 1)]
        [('c', '1', 1)]
    ]
理想情况下,我希望得到的真正结果是:

result = [
        [('a', '1', 1), ('a', '1', 2)],
    ]

如果没有匹配对,那么它会将它们排除在外,但我想我可以使用
set()

使用
dict.setdefault

Ex:

r = {}
for i in lst:
    r.setdefault((i[0], i[1]), []).append(i)   #key -> First 2 values

print(list(r.values()))
#OR print([i for i in r.values() if len(i) > 1])
[[('a', '1', 1), ('a', '1', 2)],
 [('a', '2', 2)],
 [('b', '1', 1)],
 [('c', '1', 1)]]
输出:

r = {}
for i in lst:
    r.setdefault((i[0], i[1]), []).append(i)   #key -> First 2 values

print(list(r.values()))
#OR print([i for i in r.values() if len(i) > 1])
[[('a', '1', 1), ('a', '1', 2)],
 [('a', '2', 2)],
 [('b', '1', 1)],
 [('c', '1', 1)]]

这几乎就是我要寻找的,问题是它是根据元组中的第一个值而不是前两个值来对它们进行分组的。让我快速编辑我的问题,让它更清楚一点。我的不好,但我喜欢将其作为一种解决方案,如果按一个值进行分组,那么它是:)如果需要前两个值,则使用
r.setdefault((I[0],I[1]),[])。append(I)
r.setdefault(tuple(I[:2]),[])。append(I)
这就是它。我不知道它是这样工作的:)你介意用这个修改你的答案,这样我就可以把它标记为正确的答案吗?