【问题标题】:Removing duplicates from nested list based on first 2 elements根据前 2 个元素从嵌套列表中删除重复项
【发布时间】:2022-01-09 01:37:49
【问题描述】:

仅当前两个元素相同时,我才尝试从嵌套列表中删除重复项,而忽略第三个。

列表:

L = [['el1','el2','value1'], ['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]

会返回:

L = [['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]

我找到了一个简单的方法来做类似的here

dict((x[0], x) for x in L).values()

但这仅适用于第一个元素而不是前 2 个,但这正是我想要的。

【问题讨论】:

    标签: python list


    【解决方案1】:

    如果顺序无关紧要,您可以使用相同的方法,但使用第一个和第二个元素的元组作为键:

    {(x[0], x[1]): x for x in L}.values()
    

    或者在 Python 2.7 之前的版本上:

    dict(((x[0], x[1]), x) for x in L).values()
    

    你可以使用tuple(x[:2]),而不是(x[0], x[1]),使用你认为更易读的那个。

    【讨论】:

      【解决方案2】:

      如果顺序很重要,请使用 set 仅包含嵌套列表的前两个元素:

      seen = set()
      seen_add = seen.add
      return [x for x in seq if tuple(x[:2]) not in seen and not seen_add(tuple(x[:2]))]
      

      或者您可以使用collections.OrderedDict() 对象来保持订单;将 x[:2] 切片保留为键(作为元组),并提取值:

      from collections import OrderedDict(
      
      return OrderedDict((tuple(x[:2]), x) for x in seq).values()
      

      在 Python 3.6 及更高版本中,标准 dict 类型恰好也保留了插入顺序:

      return list({tuple(x[:2]): x for x in seq}.values())
      

      需要list() 调用才能将字典视图对象转换为列表。

      【讨论】:

      • 如果您真的需要它快速,我想这是一个很好的解决方案,但在大多数情况下,这只是难以阅读且不符合pythonic。对有副作用的推导说不。
      • @Aran-Fey:也许,但是这个特定的模式used to be the fastest method for this specific use case。如果您需要性能,实用主义胜过纯洁。
      【解决方案3】:

      应该这样做:

      In [55]: dict((tuple(x[:2]), x) for x in L).values()
      Out[55]: [['el1', 'el2', 'value2'], ['el1', 'el5', 'value3'], ['el3', 'el4', 'value2']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2020-12-21
        • 2016-10-19
        • 1970-01-01
        • 2021-06-11
        • 2020-04-01
        • 1970-01-01
        相关资源
        最近更新 更多