【问题标题】:Remove duplicated tuples from list based on the first entry of tuple [duplicate]根据元组的第一个条目从列表中删除重复的元组 [重复]
【发布时间】:2018-08-06 10:19:33
【问题描述】:

我在这里有一个这样的元组列表:

test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]

我想从已经出现第一个元素的列表中删除那些元组。所以想要的输出是

[('ent1', 24), ('ent2',12), ('ent3',4.5)]

我不知道该怎么做。通常,如果我想删除完全重复的元组,我会使用

list(set(test))

但这在这种情况下不起作用。有没有人解决这个问题的合适方法?

【问题讨论】:

    标签: python list duplicates tuples


    【解决方案1】:

    你觉得dict(test)的输出怎么样?

    {'ent1': 4, 'ent2': 3.5, 'ent3': 4.5}
    

    或者您可能希望将其转换回元组列表

    >>> list(dict(test).items())
    [('ent1', 4), ('ent2', 3.5), ('ent3', 4.5)]
    

    编辑:这将保留最后一个分配的值,但您也可以通过首先反转您的列表来保留第一个分配的值:

    >>> list(dict(reversed(test)).items())
    [('ent2', 12), ('ent1', 24), ('ent3', 4.5)]
    

    Edit2:如果您还想保留列表顺序,这似乎是一个很好的单线解决方案(受 Julien 的回答启发):

    >>> [(uk,next(v for k,v in test if k == uk)) for uk in dict(test).keys()]
    [('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
    

    最后,你可以使用 functools.reduce 获得另一个单线:

    >>> from functools import reduce
    >>> reduce(lambda lu,i:i[0] in dict(lu).keys() and lu or lu+[i], test, [])
    [('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
    

    解释:lu 是只有唯一键的列表,itest 列表中的下一项。如果i[0],即下一个元素的key已经在lu中,则保留lu,否则追加i

    【讨论】:

    • dict 不保持顺序。这就是我接受另一个答案的原因。
    • @WinterMensch 相应地更新了我的答案。
    • @WinterMensch 在 Python 3.6 及更高版本中,dict 确实保持顺序。但是,set 仍然没有保持顺序,因此您在问题中的代码不会保持顺序。
    • @WinterMensch 我想现在我找到了一个优雅的良好的 1-liner 解决方案。
    【解决方案2】:

    使用检查标志

    例如:

    test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
    check_val = set()      #Check Flag
    res = []
    for i in test:
        if i[0] not in check_val:
            res.append(i)
            check_val.add(i[0])
    print(res) 
    

    输出:

    [('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
    

    【讨论】:

      【解决方案3】:
      test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
      deduplicated_test = [(s,[t[1] for t in test if t[0] == s][0]) for s in sorted(set([t[0] for t in test]))]
      

      读起来很短很痛苦,抱歉。 我不记得为什么 sorted(set()) 有效而 set() 无效,但无论如何......

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 2020-03-25
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 2018-12-25
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多