我正在尝试根据共同标准对字典列表进行排名。所以我的列表看起来像这样:
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(如果可能)
答案 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__
来电。