首页 > 解决方案 > 如何对具有多个匹配值的列表中的元组进行分组

问题描述

我想尽可能有效地对具有多个公共值的元组列表进行分组。我知道这样做的漫长方法,但想知道更快更“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()

标签: python-3.xlisttuplesgrouping

解决方案


使用dict.setdefault

前任:

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)]]

推荐阅读