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])
我正在尝试根据通用标准对字典列表进行排名。所以我的列表看起来像这样:
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])