【问题标题】:how to sort a list of tuples with list[i][1] as key from biggest to smallest [duplicate]如何以list [i] [1]为键从最大到最小对元组列表进行排序[重复]
【发布时间】:2015-07-27 22:10:33
【问题描述】:

这是我的清单。

[('a', 12), ('c', 4), ('b', 3), ('e', 6), ('d', 5), ('g', 50), ('f', 30),]  

排序这个列表的结果是。

[('g', 50), ('f', 30), ('a', 12), ('e', 6), ('d', 5), ('c', 4), ('b', 3)]  

我尝试使用:

x = sorted(alpha_items, key=lambda x: x[1],)  

但我需要扭转它。

我可以添加另一个密钥吗?

【问题讨论】:

    标签: python sorting key


    【解决方案1】:

    显而易见的方法是显式使用专门为此目的而存在的reverse 参数:

    sorted(alpha_items, key=lambda x: x[1], reverse=True)
    

    如果你按数字排序,你也可以直接否定它们:

    sorted(alpha_items, key=lambda x: -x[1])
    

    【讨论】:

    • reversed(alpha_items, key=lambda x: x[1])
    • @TigerhawkT3 哦,谢谢。我从来不知道。
    • @MalikBrahimi 我猜你的意思是reversed(sorted...?我曾考虑过这一点,但它为您提供了一个迭代器,更重要的是,我认为排序然后反向而不是立即按所需顺序排序是错误,特别是因为反向参数存在于此。
    • @StefanPochmann 不,我的意思是用键严格反转,但我错了。
    【解决方案2】:

    operator.itemgetter(n) 构造一个可调用对象,假定可迭代对象(列表、元组、集合)作为输入并从中获取第 n 个元素。

    In [26]: mylist=[('a', 12), ('c', 4), ('b', 3), ('e', 6), ('d', 5), ('g', 50), ('f', 30),]
    
    In [27]: from operator import itemgetter
    
    In [30]: s_l=sorted(mylist,key=itemgetter(1),reverse=True)
    
    In [31]: s_l
    Out[31]: [('g', 50), ('f', 30), ('a', 12), ('e', 6), ('d', 5), ('c', 4), ('b', 3)]
    

    【讨论】:

      【解决方案3】:

      为什么不用像气泡这样的简单排序算法?

      基本上我们检查是否:

      a[i][1]<a[i+1][1]. 
      

      如果是这样的话,我们就简单地交换它们。

      重复。

      查看sorting-algorithms.com并查看Bubble算法动画。

      >>> a = [('a', 12), ('c', 4), ('b', 3), ('e', 6), ('d', 5), ('g', 50),('f', 30),]  
      >>> for elem in range(len(a)-1, 0, -1): 
      ...   for i in range(elem):
      ...     if a[i][1]<a[i+1][1]:
      ...        a[i], a[i+1] = a[i+1], a[i]
      ... 
      >>> a
      [('g', 50), ('f', 30), ('a', 12), ('e', 6), ('d', 5), ('c', 4), ('b', 3)]
      

      【讨论】:

      • 您应该解释这段代码的工作原理和方式。否则,对原发帖者无益。
      【解决方案4】:
      alpha_items.sort(key=lambda s:s[1], reverse = True)
      

      【讨论】:

      • 只有第二个有效。第一个按最后一个项的升序值排序,恰好是第二项。
      • 感谢@TigerhawkT3 的提醒
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2016-10-31
      • 2019-05-11
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多