【问题标题】:Sort list of dictionary items based on custom comparator in python基于python中的自定义比较器对字典项列表进行排序
【发布时间】:2013-06-28 00:35:03
【问题描述】:

我有一个值字典,我想根据我自己定义的比较进行排序。我知道你不能对字典进行排序。这是重要的代码:

def cmpFirstVals(tup1,tup2):
  if tup1[0] > tup2[0]:
    return True
  else:
    return False
def cmpSecondVals(tup1,tup2):
  if tup1[1] > tup2[1]:
    return True
  else:
    return False

所以这两个比较函数接受两个整数的两个元组。它比较两个元组,如果第一个更高,则返回 true,因此如果使用第二个比较器,则 (0,4) 将高于 (0,3)。同样,

cmpFirstVals((4,2),(2,2))

将返回 True。

我的 dict 是用字符串作为键和两个 int 元组作为值构建的:

d = {'objA':(1,12),'objB':(13,3)} //etc etc etc

我知道可以对列表 d.items() 进行排序,我最终会用排序列表中的前三项构建一个 dict,但我需要使用这些比较器进行排序。

我需要知道如何通过这些比较器进行排序?

另外,请注意,如果两个元组具有相同的索引值,比较器将返回 false。 (即 cmpFirstVals((4,2),(4,3)) 将返回 false)

【问题讨论】:

  • 专业提示:expr1 > expr2通常已经产生了一个布尔值。只需return tup1[0] > tup2[0] 就足够了。如果您有自定义类型可能会从__gt__ 和朋友那里返回其他内容,请使用return bool(tup1[0] > tup2[0])。不需要if exr: return True; else: return False 冗长。

标签: python list sorting dictionary tuples


【解决方案1】:

嗯……

byfirst = sort(somedict.values(), key=operator.itemgetter(0))
bysecond = sort(somedict.values(), key=operator.itemgetter(1))

二进制比较器在 2.x 中已弃用,并在 3.x 中删除。

【讨论】:

    【解决方案2】:

    如果您希望排序列表仅包含值元组:

    >>> d = {'objA':(1,12),'objB':(13,3)}
    >>> sorted(d.values())
    [(1, 12), (13, 3)]
    >>> sorted(d.values(), key=lambda t: t[1])
    [(13, 3), (1, 12)]
    

    如果你想要字典中值的完整元组:

    >>> sorted(d.items(),key=lambda t: t[1][1])
    [('objB', (13, 3)), ('objA', (1, 12))]
    >>> sorted(d.items(),key=lambda t: t[1][0])
    [('objA', (1, 12)), ('objB', (13, 3))]
    

    编辑(根据您的评论):

    def f(d,c):
        return sorted(d.items(),key=c) 
    
    print(f(d,lambda t: t[1][0]))  
    

    key 接受一个函数。所以你可以这样做:

    def cmpFirstVal(t1):
        return t1[1][0]
    
    def cmpSecondVal(t1):
        return t1[1][1]
    
    def f(d,c):
        return sorted(d.items(),key=c) 
    
    print(f(d,cmpFirstVal)) 
    print(f(d,cmpSecondVal)) 
    

    【讨论】:

    • 这里唯一的问题是我需要将这种排序嵌入到另一个函数中,该函数将一个比较器作为参数。我知道使用 sorted() 和 lambda 是一种有效的方法,但这是我被赋予的任务......
    猜你喜欢
    • 2020-07-11
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多