2013-06-28 3 views
0

я хранящийся namedtuple как значение в словаре, как показано нижеКак сортировать namedtuple хранится в значении Словаря по значению кортежа

AssetList = {} 
Asset = namedtuple('Asset_Desc', 'value weight value_per_unit') 
for i in range(0,items): 
    AssetList[i] = Asset(values[i], weights[i], values[i]/weights[i]) 
print AssetList 

Я хотел бы отсортировать словарь, основанный на «value_per_unit», так что я написал что-то вроде ниже. Но мне интересно, что должно быть в «ключевом»? Я попробовал itemgetter и attrgetter, но, похоже, у меня неверный индекс, я не могу понять, как обращаться к Asset.value_per_unit. Есть идеи?

Sorted_AssetList = sorted(AssetList.iteritems(), key=???) 
print Sorted_AssetList 

ответ

2

Вы сортировки ключ-значение кортежа, который выглядит как (1, asset), так что вы можете использовать функцию:

..., key=lambda pair: pair[1].value_per_unit) 

Кроме того, это не кажется, как хорошо использовать для словаря. Я хотел бы использовать список вместо:

Asset = namedtuple('Asset_Desc', 'value weight value_per_unit') 

assets = [] 

for i in range(items): 
    assets.append(Asset(values[i], weights[i], values[i]/weights[i])) 

И сортировать результат enumerate(), если вы действительно нужны показатели:

sorted_assets = sorted(enumerate(assets), key=lambda pair: pair[1].value_per_unit) 

В противном случае, вы можете просто использовать attrgetter:

from operator import attrgetter 

sorted_assets = sorted(assets, key=attrgetter('value_per_unit')) 
+0

здорово! Я изменил его на Sorted_Asset = sorted (AssetList.iteritems(), key = lambda (k, v): v.value_per_unit, reverse = True), поэтому его легче подготовить (ключ, значение) вместо пары. Благодаря! – twfx

+0

@twfx: Последовательность распаковки в аргументах функции была удалена в Python 3 (хотя я согласен, что она полезна для 'lambda'). – Blender

+0

arh .... Я тоже сделал «список», хммм ... кажется, лучше переходить от словаря к списку. Благодарю. Мне нравится твоя идея. – twfx