Python 词典排行榜

Python rank list of dictionaries

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

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(如果可能的话)

你的方法的问题是你试图将一个计算值传递给 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__ 调用。

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