2014-12-04 90 views
1

我想要做的实际上是两件事情,第一,我需要做下面的列表:如何对字典内的列表进行排序?

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 

这将是非常有用的,因为即时通讯使用它为我的儿子的生日派对 我已经搜遍了几乎每一个类似的问题,并找不到任何工作......任何帮助将不胜感激。谢谢:)

+2

欢迎来到堆栈溢出,你能告诉我们你已经尝试过但是无法工作吗? – 2014-12-04 07:42:08

回答

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]: 

COMMENTS

有一个反复使用的成语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中的情况。

+0

谢谢,这非常有帮助:)现在应该有问题排序,我会告诉你,如果我有任何重大麻烦,否则,再次感谢! – James9182 2014-12-04 16:30:46

+0

不要犹豫,问。再见 – gboffi 2014-12-04 19:27:41

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]] 
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)] 
0

排序中字典列表是

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