如何对字典中的列表进行排序?

时间:2014-12-04 07:36:45

标签: python sorting dictionary

我想要做的事实上是两件事,首先,我需要制作以下列表:

 teammates={"Ali":[1,5,8],"James":[3,2,1],"Fred":[9,4,2]}

并将数字列表相加并除以3(计算出平均值)并按从这个高度到最低值进行排序:

Fred : 5
Ali : 4.7
James : 2

其次,我需要让程序只打印每个队友的最高分,然后从最高到最低排序如下:

Fred : 9
Ali : 8
James : 3

这将非常有用,因为我正在为我的儿子生日派对使用它 我已经搜索了几乎所有与此类似的问题,并且找不到任何有用的东西......任何帮助都将非常感激。谢谢:))

4 个答案:

答案 0 :(得分:0)

使用sorted和lambda

>>> teammates={"Ali":[1,5,8],"James":[3,2,1],"Fred":[9,4,2]}
>>> sorted([[x,sum(y)/float(len(y))] for x,y in teammates.items()],key=lambda x:x[1])
[['James', 2.0], ['Ali', 4.666666666666667], ['Fred', 5.0]]

高分:

>>> sorted([[x,max(y)] for x,y in teammates.items()],key=lambda x:x[1],reverse=True)
[['Fred', 9], ['Ali', 8], ['James', 3]]

答案 1 :(得分:0)

我建议您使用max()获取列表中的最大值sum()以获取列表中所有元素的总和,len()以获取数组的大小:

teammates={"Ali":[1,5,8],"James":[3,2,1],"Fred":[9,4,2]}

# Use sum and len to get average
teammates_average={
                    "Ali":sum(teammates['Ali'])/float(len(teammates['Ali'])),
                    "James":sum(teammates['James'])/float(len(teammates['James'])),
                    "Fred":sum(teammates['Fred'])/float(len(teammates['Fred'])),
                  }
Output: {'Ali': 4.666666666666667, 'Fred': 5.0, 'James': 2.0}
# Use max to get the highest value
teammates_highest={
                    "Ali":max(teammates['Ali']),
                    "James":max(teammates['James']),
                    "Fred":max(teammates['Fred']),
                  }
Output: {'Ali': 8, 'Fred': 9, 'James': 3}

# Order last output
sorted(teammates_highest.items(), key=operator.itemgetter(1), reverse=True)

Output: [('Fred', 9), ('Ali', 8), ('James', 3)]

答案 2 :(得分:0)

对字典中的列表进行排序

 >>>>sorted(teammates.items(), key=lambda (k, v): v[1], reverse=True)
 >>>>[('Ali', [1, 5, 8]), ('Fred', [9, 4, 2]), ('James', [3, 2, 1])]

答案 3 :(得分:0)

我们将使用3种不同的功能,其名称具有足够的描述性......

def dict_of_means(d):
    return {k:sum(v)*1.0/v.count() for k, v in d.items()}

注意乘以1.0以强制浮动。

def dict_of_max(d):
    return {k:max(v) for k, v in d.items()}

最后

def print_sorted(d,is_float=0):
    l = [(v, k) for k, v in d.items()]
    l.sort()
    for v, k in l[::-1]:
        if is_float:
            print "%-12s%5.2" % (k+" :", v)
        else:
            print "%-12s%2d" % (k+" :", v)

使用示例

In [31]: teammates={"Ali":[1,5,8],"James":[3,2,1],"Fred":[9,4,2]}

In [32]: print_sorted(dict_of_max(teammates))
Fred :       9
Ali :        8
James :      3

In [33]: print_sorted(dict_of_means(teammates), 1)
Fred :       5.00
Ali :        4.67
James :      2.00

In [34]: 

注释

在所有三个函数中都使用了一个重复的习语for k, v in d.items()。 字典方法d.items()为您提供元组列表,例如,

In [34]: teammates.items()
Out[34]: [('James', [3, 2, 1]), ('Fred', [9, 4, 2]), ('Ali', [1, 5, 8])]

并通过将每个元组依次解压缩到循环变量k(对于密钥,它非常传统)和v(对于值)来分配每个元组的内容。

此时,在所谓的理解中,您可以使用大括号来构建字典' {}'或使用直括号的列表' []'您可以返回给调用者,或者您可以进一步处理print_sorted中的情况。