2016-03-14 3 views
0

Я пытаюсь ранжировать список словарей на основе общих критериев. Так что мой список выглядит примерно так:Python 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 для этого (если возможно)

+0

Я не понимаю, где значения '1' и' 2' приходят из – gtlambert

+0

Используйте 'ключ = лямбда х: х [критериев]'. Кроме того, в 'sorted()', используйте 'range (1, len (mylist) + 1)'. Как это, вы получите '[0, 1]' и '[1, 0]', а не '[1, 2]' и '[2, 1]'. ** Не используйте ** list 'как имя переменной, потому что он конфликтует со встроенным типом. – zondo

+0

@gtlambert: Он использует индексирование на основе 1. – zondo

ответ

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

Это работает! Благодаря! – akhiljain

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__.

+0

'def rank_simple (список, критерии): return sorted (range (len (list)), reverse = True, key = lambda x: x [критерии]) d = [{'key1': 0, 'key2' : 1}, {'key1': 1, 'key2': 0}] print rank_simple (d, 'key1') ' – akhiljain

+0

Это дает мне ошибку' TypeError: 'int' объект не имеет атрибута '__getitem __' ' – akhiljain

+0

Извините, увлекся редактированием ... Я обновился, чтобы опубликовать сейчас. –

Смежные вопросы