2017-02-07 6 views
0

Перед написанием функции, я хотел бы, чтобы убедиться, что нет заранее построенного (оптимизированного) решения (например, сортируются()), которые могут:Заказать словарь на основе конкретных значений

Из словаря, как эта :

tags = {'pinoyako':{'likes': 119, 'comments': 11, 'count': 1}, 'dii':{'likes': 151, 'comments': 3, 'count': 1},'djiphantom3':{'likes': 127, 'comments': 6, 'count': 1}} 

Закажите ключи на основе «любит», «комментарии» или «счет». Если он основан на «любит», то выход должен быть список скомандовал:

output = [['dii',151],['djiphantom3',127],['pinoyako',119]] 

ответ

2

Используйте generator expression в sorted() функции с соответствующим ключом функции:

In [22]: from operator import itemgetter 
In [23]: sorted(((k, v['likes']) for k, v in tags.items()), key=itemgetter(1), reverse=True) 
Out[23]: [('dii', 151), ('djiphantom3', 127), ('pinoyako', 119)] 
+1

секунд до меня, или вот функция: ' def my_sort (dct, name): return sorted ([[k, v [имя]] для k, v в dct.items()], key = i temgetter (1), reverse = True) ' –

+0

Clear, Большое спасибо. –

0

Вам нужно больше записей, чтобы проиллюстрировать. Проверьте это:

tags = {'pinoyako':{'likes': 119, 'comments': 11, 'count': 1}, 
     'pinoyako2':{'likes': 120, 'comments': 5, 'count': 2}, 
     'djiphantom32':{'likes': 1275, 'comments': 61, 'count': 15}, 
     'dii2':{'likes': 151, 'comments': 33, 'count': 13}, 
     'dii':{'likes': 151, 'comments': 3, 'count': 1}, 
     'djiphantom3':{'likes': 1275, 'comments': 61, 'count': 1} 
     } 
tags_sorted = sorted(tags.items(), key=lambda x: (x[1]['likes'], x[1]['comments'], x[1]['count'])) 
tags_sorted 

Выход:

[('pinoyako', {'comments': 11, 'count': 1, 'likes': 119}), 
('pinoyako2', {'comments': 5, 'count': 2, 'likes': 120}), 
('dii', {'comments': 3, 'count': 1, 'likes': 151}), 
('dii2', {'comments': 33, 'count': 13, 'likes': 151}), 
('djiphantom3', {'comments': 61, 'count': 1, 'likes': 1275}), 
('djiphantom32', {'comments': 61, 'count': 15, 'likes': 1275})] 

Тогда вы можете сделать это:

tags_sorted = [[k, v['likes']] for k,v in tags_sorted] 
tags_sorted 

Выход:

[['pinoyako', 119], 
['pinoyako2', 120], 
['dii', 151], 
['dii2', 151], 
['djiphantom3', 1275], 
['djiphantom32', 1275]] 
+0

Спасибо, это интересно, но это не выход, который я ищу. –

+0

@YassineBelmamoun '" Заказать ключи на основе 'likes', 'comments' или 'count' "'? – MYGz

+0

О, я взял его как 'и' вместо' или'. – MYGz

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