【问题标题】:How to group tuples in a list with multiple values matching如何在具有多个匹配值的列表中对元组进行分组
【发布时间】:2020-08-13 12:49:34
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

    • 这几乎就是我要找的东西,问题是它按元组中的第一个值而不是前两个值对它们进行分组。让我快速编辑我的问题,以便更清楚一点。我的错,但如果按一个值分组,我喜欢这个解决方案:)
    • 如果您需要前两个,请使用r.setdefault((i[0], i[1]), []).append(i)r.setdefault(tuple(i[:2]), []).append(i)
    • 就是这样。我不知道它会这样工作:) 你介意你是否可以用这个修改你的答案,以便我可以将其标记为正确的答案?
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2013-11-07
    相关资源
    最近更新 更多