【问题标题】:Python rank list of dictionariesPython 字典排名列表
【发布时间】:2016-03-14 12:53:49
【问题描述】:

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

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

【问题讨论】:

  • 我不明白 12 的值来自哪里
  • 使用key=lambda x: x[criteria]。此外,在sorted() 中,使用range(1, len(mylist) + 1)。怎么样,你会得到[0, 1][1, 0],而不是[1, 2][2, 1]不要使用list作为变量名,因为它与内置类型冲突。
  • @gtlambert:他正在使用基于 1 的索引。
  • @ScottHunter 修改了问题。希望现在更清楚:)
  • @akhiljain:非常清楚,只是错了。

标签: python list dictionary rank


【解决方案1】:
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])

【讨论】:

    【解决方案2】:

    您的方法的问题是您尝试将计算值传递给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_simple(list, criteria): return sorted(range(len(list)), reverse = True, key = lambda x: x[criteria]) d = [{'key1': 0, 'key2': 1},{'key1': 1, 'key2': 0}] print rank_simple(d, 'key1')
    • 这给了我错误TypeError: 'int' object has no attribute '__getitem__'
    • 对不起,我被编辑带走了……我已经更新到现在发布了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2018-02-06
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多