代码之家  ›  专栏  ›  技术社区  ›  Steve Tjoa

Python:有条件地从列表中删除元素

  •  9
  • Steve Tjoa  · 技术社区  · 14 年前

    x = [(1,2), (3,4), (7,4), (5,4)]
    

    在共享第二个元素的所有元组中,我希望保留第一个元素最大的元组:

    y = [(1,2), (7,4)]
    

    用Python实现这一点的最佳方法是什么?


    • 元组可以是两个元素列表,如果这有区别的话。
    • 所有元素都是非负整数。
    • 我喜欢现在的答案。我真的应该多了解一下 collections 必须提供!
    5 回复  |  直到 14 年前
        1
  •  5
  •   John La Rooy    14 年前

    类似于亚伦的回答

    >>> from collections import defaultdict
    >>> x = [(1,2), (3,4), (7,4), (5,4)]
    >>> d = defaultdict(int)
    >>> for v,k in x:
    ...   d[k] = max(d[k],v) 
    ... 
    >>> y=[(k,v) for v,k in d.items()]
    >>> y
    [(1, 2), (7, 4)]
    

    >>> y = [(k,v) for k,v in x if d[v]==k]
    >>> y
    [(1, 2), (7, 4)]
    

    这是另一种方法。它使用更多的存储空间,但对max的调用较少,因此可能更快

    >>> d = defaultdict(list)
    >>> for k,v in x:
    ...   d[v].append(k)
    ... 
    >>> y = [(max(k),v) for v,k in d.items()]
    >>> y
    [(1, 2), (7, 4)]
    

    >>> y = [(k,v) for k,v in x if max(d[v])==k]
    >>> y
    [(1, 2), (7, 4)]
    
        2
  •  5
  •   aaronasterling    14 年前

    使用 collections.defaultdict

    import collections
    
    max_elements = collections.defaultdict(tuple)
    
    for item in x:
        if item > max_elements[item[1]]:
            max_elements[item[1]] = item
    
    y = max_elements.values()
    
        3
  •  2
  •   gotgenes    14 年前

    如果可以假设具有相同第二个元素的元组以连续顺序出现在原始列表中 x itertools.groupby :

    import itertools
    import operator
    
    def max_first_elem(x):
        groups = itertools.groupby(x, operator.itemgetter(1))
        y = [max(g[1]) for g in groups]
        return y
    

    注意,这将保证保持组的顺序(通过第二个元组元素),如果这是输出所需的约束。

        4
  •  0
  •   Steve Tjoa    14 年前

    我自己的尝试,有点受阿伦斯特林的启发:

    def processtuples(x):
        d = {}
        for item in x:
            if x[0] > d.get(x[1],-1):
                d[x[1]] = x[0]
    
        y = []
        for k in d:
            y.append((d[k],k))
        y.sort()
        return y
    
        5
  •  0
  •   pillmuncher    14 年前
    >>> from collections import defaultdict
    >>> d = defaultdict(tuple)
    >>> x = [(1,2), (3,4), (7,4), (5,4)]
    >>> for a, b in x:
    ...     d[b] = max(d[b], (a, b))
    ...
    >>> d.values()
    [(1, 2), (7, 4)