2016-07-27 3 views
0

Я хочу отсортировать следующие словарь по ключам score, который представляет собой массив.Python сортировочный словарь

student = {"name" : [["Peter"], ["May"], ["Sharon"]], 
      "score" : [[1,5,3], [3,2,6], [5,9,2]]} 

Для лучшего представления:

Peter ---- [1,5,3] 
May ---- [3,2,6] 
Sharon ---- [5,9,2] 

Здесь я хочу использовать второй элемент из score сортировать name в список.

Ожидаемый результат:

name_list = ("May ", "Peter", "Sharon") 

Я пытался использовать

sorted_x = sorted(student.items(), key=operator.itemgetter(1))

и

for x in sorted(student, key=lambda k: k['score'][1]): 
    name_list.append(x['name']) 

но оба не работают.

+3

Во-первых, это не действительная инициализация словаря, во-вторых, что вы пробовали до сих пор? –

+2

В-третьих, это кажется довольно странным способом хранения этих данных. Похоже, вы не получаете много от dict в этом случае: 'name = [['Peter'], ['May'], ['Sharon']]' - И вы мало выигрываете от того, чтобы список списка либо ... 'name = ['Peter', 'May', 'Sharon']'. – mgilson

+0

Спасибо за ваш ответ. Я обновил свой вопрос. – VICTOR

ответ

3

Сначала запишите имя и оценку учащимся zip.

zip(student["name"], student["score"]) 

вы получите лучшее представление:

[(['May'], [3, 2, 6]), 
(['Peter'], [1, 5, 3]), 
(['Sharon'], [5, 9, 2])] 

затем сортировать этот список и получить имя студента:

In [10]: [ i[0][0] for i in sorted(zip(student["name"], student["score"]), key=lambda x: x[1][1])] 
Out[10]: ['May', 'Peter', 'Sharon'] 

знать о отсортированного Buildin функции первого: https://docs.python.org/2/howto/sorting.html#sortinghowto

+0

Спасибо, это работает !!!!!!!! Ницца. – VICTOR

1

Это, вероятно, будет работать для вас:

student = { 
    "name": [["Peter"], ["May"], ["Sharon"]], 
    "score": [[1,5,3], [3,2,6], [5,9,2]] 
} 

# pair up the names and scores 
# this gives one tuple for each student: 
# the first item is their name as a 1-item list 
# the second item is their list of scores 
pairs = zip(student['name'], student['score']) 

# sort the tuples by the second score: 
pairs_sorted = sorted(
    pairs, 
    key=lambda t: t[1][1] 
) 

# get the names, in order 
names = [n[0] for n, s in pairs_sorted] 

print names 
# ['May', 'Peter', 'Sharon'] 
0

Если вы хотите использовать словари, я предлагаю использовать OrderedDict:

name = ["Peter", "May", "Sharon"] 
score = [[1,5,3], [3,2,6], [5,9,2]] 
d = {n: s for (n, s) in zip(name, score)} 

from collections import OrderedDict 
ordered = OrderedDict(sorted(d.items(), key=lambda t: t[1][1])) 
list(ordered) # to retrieve the names 

Но, если нет, то следующий будет более простой подход:

name = ["Peter", "May", "Sharon"] 
score = [[1,5,3], [3,2,6], [5,9,2]] 
d = [(n, s) for (n, s) in zip(name, score)] 

ordered = sorted(d, key=lambda t: t[1][1]) 
names_ordered = [item[0] for item in ordered] 
Смежные вопросы