Python排名词典列表

时间:2016-03-14 12:53:49

标签: python list dictionary rank

我正在尝试根据共同标准对字典列表进行排名。所以我的列表看起来像这样:

d = [{'key1': 0, 'key2': 1}, {'key1': 1, 'key2': 0}]

我想根据我指定的标准获得每个字典的排名(以相反的顺序排列)。因此,如果标准是'key1',则输出应为:

1 0

如果标准是'key2',则输出应为:

0 1

我尝试了以下功能:

def rank_simple(list, criteria):
    return sorted(range(len(list)), reverse = True, key = type(list).__getitem__(list)[criteria])

给出错误:

TypeError: __getitem__() takes exactly one argument (0 given)

def rank_simple(list, criteria):
    return sorted(range(len(list)), reverse = True, key = list.__getitem__[criteria])

给出错误:

TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

根据Efficient method to calculate the rank vector of a list in Python

中的建议

我该如何解决这个问题。请注意,我不想使用scipy或numpy(如果可能)

2 个答案:

答案 0 :(得分:2)

def rank(data,key):
    # Make a list or ranks to be sorted
    ranks = [x+1 for x in xrange(len(data))]
    # Sort ranks based on the key of data each refers to
    return sorted(ranks, reverse=True, key=lambda x:data[x-1][key])

答案 1 :(得分:0)

你的方法的问题是你试图将计算值传递给key参数到sorted,而你需要传递一个接受一个参数的函数(每个项都是依次排序)并计算每个项目的排序键:

def rank_simple(list, criteria):
    return [index for index, value in sorted(enumerate(list), reverse = True, key = lambda item: item[1][criteria])]

此外,您使用了__getitem__错误;要么使用[]访问字典项,要么使用__getitem__来电。