【问题标题】:Python sort items by specific defined rulePython按特定定义的规则对项目进行排序
【发布时间】:2011-05-16 16:35:52
【问题描述】:

假设我有一个字典:d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5}

如果我想编写一个函数,如果我将该函数传递给内置的排序函数,例如。 list(d).sort(function),排序函数将根据值对列表进行排序,任何具有相同值的,按它们的键排序(字母顺序)。因此,在这种情况下,d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5,'TAM':0} 返回 ['amy' ,'Abc','abc','杰克','TAM','汤姆'] 该函数应如下所示:

def arrange_items(something, thing,**may be a function**): 
        if something < thing:
                return -1 
        elif something > thing:
                return 1 
        etc

如果我调用 some_list.sort(arrange_items),我应该得到一个排序列表

提前谢谢你

规范的修改(另一个问题): 如果我有 twitter 用户名的字典,则字典格式如下:

dict = {'JohnZ':{'name': Jonny Zue,'follow':'MiniT',}, etc} # JohnZ is one of the twitter user. The follow means people that JonhZ follows, in this case it is MiniT.

一个用户的人气是指关注这个特定用户的人数,在上面的例子中,MiniT 的人气至少是一个 b/c 至少有一个用户关注 MiniT。

假设我有一个 twitter 用户名列表,比如 L1 = ['JonhZ','MiniT',etc],我想根据用户的受欢迎程度对 L1 进行排序(首先是较高的受欢迎程度)。 全局命名空间中已经定义了dict(我们可以直接访问dict)。这个排序函数的要求是使用L1.sort(pass_function) 我应该如何编写 pass_function 以便 sort 会根据用户的受欢迎程度自动对 L1 进行排序。

感谢您的帮助

【问题讨论】:

    标签: python list sorting dictionary


    【解决方案1】:
    [k for k, v in sorted(d.iteritems(), key=lambda x: (-x[1], x[0].lower()))]
    

    编辑:

    (我拒绝使用“dict”这个名字,因为它会隐藏一个内置函数,并且隐藏内置函数是愚蠢的)

    L1.sort(key=lambda x: (-d.get(x, 0), x.lower()))
    

    【讨论】:

    • 说某事是“愚蠢的”是没有帮助的。对于解释器和未来的编码人员来说,隐藏内置插件可能是危险和麻烦的。但不是“愚蠢”
    【解决方案2】:

    你不能用 list(d).sort(function) 来实现这个,因为你会得到一个带有字典键的列表。您可以通过其他方法实现您的目标:

    l1 = sorted(d.items(), key=lambda x: (x[1], x[0]))
    l2 = sorted(l1, key=lambda x: x[1], reverse=True)
    result = [x[0] for x in l2]
    

    这种方法将字典转换为(键,值)元组列表。然后 l1 按值排序, l2 按键排序。由于 python 有一个稳定的排序算法,所以对于相同的键值的顺序是保留的。

    编辑:Ignacio Vazquez-Abrar 的方法类似,但更优雅,因为列表只需排序一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多