【问题标题】:How to arrange a list of tuples so that the tuple associated with the highest value compared to other tuple is removed and returns the maximum one如何排列元组列表,以便删除与其他元组相比最高值的元组并返回最大值
【发布时间】:2023-03-27 17:27:01
【问题描述】:
val = [(200, []), (300, [500, 200]), (400, [100, 200, 300]), (400, [])]
largest_val_arrangement(val)
[(200, []), (300, [500, 200]), (400, [100, 200, 300])]

所以现在(400, []) 被弹出,因为(400, [100, 200, 300]) 的元素比它多。

【问题讨论】:

  • 最终结果的顺序重要吗?
  • 无顺序无所谓。

标签: python python-3.x list dictionary tuples


【解决方案1】:

您可以根据列表的长度使用sort,并使用字典以便最后写入的键“获胜”。

然后转换回tuplelist 或... 保留为dict

val = [(200, []), (300, [500, 200]), (400, [100, 200, 300]), (400, [])]

def largest_val_arrangement(val):
    return tuple({k:v for k,v in sorted(val, key = lambda t : len(t[1]))}.items())

largest_val_arrangement(val)

结果:

((200, []), (400, [100, 200, 300]), (300, [500, 200]))

这种方法,就像它使用的 sort 一样,具有 O(log(n)*n) 复杂度,(dict 具有 O(1) 平均复杂度)。

但单行并不总是最有效的解决方案。在这里使用sort 是不必要的,当带有标记字典的良好旧循环在O(n) 中工作时:

def largest_val_arrangement(val):
    d = dict()
    for k,v in val:
        if k not in d or len(d[k]) < len(v):
            d[k] = v

    return tuple(d.items())

【讨论】:

    【解决方案2】:

    其他选项,使用集合中的默认字典:

    val = [(200, []), (300, [500, 200]), (400, [100, 200, 300]), (400, [])]
    
    from collections import defaultdict
    tmp = defaultdict(list)
    
    for x in val:
      if len(x[1]) > len(tmp[x[0]]): tmp[x[0]] = x[1]
    
    res = [(k, v) for k,v in tmp.items()]
    print(res)
    
    #=> [(200, []), (300, [500, 200]), (400, [100, 200, 300])]
    

    【讨论】:

    • 那是O(n),这样更好。挑剔:使用defaultdict(list) 而不是lambda:[]。当我找到您的解决方案时,我回来添加了一个类似的答案(使用标准字典,而不是默认)。
    • 谢谢@Jean-FrançoisFabre
    【解决方案3】:

    O(n) 解

    >>> val = val = [(200, []), (300, [500, 200]), (400, [100, 200, 300]), (400, [])]
    >>>
    >>> seen = {}
    >>> for k, lst in val:
    ...:    if len(lst) > len(seen.get(k, [])):
    ...:        seen[k] = lst
    ...:        
    >>> list(seen.items())
    [(200, []), (300, [500, 200]), (400, [100, 200, 300])]
    

    【讨论】:

    • 对我们来说是一个很好的教训:sort 在这些问题上被高估了。
    • @Jean-FrançoisFabre 是的,dict 解决方案甚至在 Python 3.7 中保留了顺序。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多