2013-11-27 71 views
1

如何通過成員變量如何通過成員變量循環字典時對輸出進行排序?

class Item(): 
    def __init__(self, _name, _index, _price): 
     self.name = _name 
     self.index = _index 
     self.price = _price 

排序dictiony我想表明的指數或價格訂購的商品信息。通過指數

DicItems = {} 
DicItems["Candy"] = Item("Candy", 1, 100) 
DicItems["IceCream"] = Item("IceCream", 2, 500) 
DicItems["Snack"] = Item("Snack", 3, 300) 

打印項目列表中的順序 - >導致

Candy  1 100 
IceCream 2 500 
Snack  3 300 

打印項目列表順序按價格 - >導致蟒蛇

Candy  1 100 
Snack  3 300 
IceCream 2 500 

回答

0

字典沒有任何順序。

from operator import attrgetter 
name_getter = attrgetter('name') 
index_getter = attrgetter('index') 
price_getter = attrgetter('price') 

sorted_by_index = sorted(DicItems, key=index_getter) 
sorted_by_name = sorted(DicItems, key=name_getter) 
sorted_by_price = sorted(DicItems, key=price_getter) 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – Raptor

+0

@ShivanRaptor:是的,那是我缺乏耐心。現在修復。 – 0xc0de

1

準備代碼:

class Item(): 
    def __init__(self, _name, _index, _price): 
     self.name = _name 
     self.index = _index 
     self.price = _price 
    def items(self): 
     return self.name, self.index, self.price 

d = {} 
d["Candy"] = Item("Candy", 1, 100) 
d["IceCream"] = Item("IceCream", 2, 500) 
d["Snack"] = Item("Snack", 3, 300) 

排序代碼:

你想要的東西,它可以通過執行以下操作來實現

print [item.items() for item in sorted(d.values(), key = lambda x:x.index)] 
print [item.items() for item in sorted(d.values(), key = lambda x:x.price)] 

Outpu牛逼

[('Candy', 1, 100), ('IceCream', 2, 500), ('Snack', 3, 300)] 
[('Candy', 1, 100), ('Snack', 3, 300), ('IceCream', 2, 500)] 

或者我們可以用attrgetter概括它像這樣

from operator import attrgetter 
def sorter(d, key): 
    return [item.items() for item in sorted(d.values(), key = attrgetter(key))] 

print sorter(d, "index") 
print sorter(d, "name") 
print sorter(d, "price") 

輸出

[('Candy', 1, 100), ('IceCream', 2, 500), ('Snack', 3, 300)] 
[('Candy', 1, 100), ('IceCream', 2, 500), ('Snack', 3, 300)] 
[('Candy', 1, 100), ('Snack', 3, 300), ('IceCream', 2, 500)] 
+1

爲什麼不僅僅是[item [1] .items()用於sort(d.items(),key = lambda x:x [1] .index)]'中的項目?對'dict'進行大量的查找似乎沒有必要。 –

+0

@Lattyware改變了它。我們甚至不需要'items()',我用'values()':) – thefourtheye

+0

確實,這看起來不錯。 +1。 –

0

比較困難,但更普遍

from operator import attrgetter 

class DictItems(dict): 

    def sortByPrice(): 
     return sorted(self.values(), key=attrgetter('price')) 

    def sortByIndex(): 
     return sorted(self.values(), key=attrgetter('index')) 

d = DictItems() 
d["Candy"] = Item("Candy", 1, 100) 
d["IceCream"] = Item("IceCream", 2, 500) 
d["Snack"] = Item("Snack", 3, 300) 

d.sortByPrice() 
d.sortByIndex() 
+0

也許valuesSortedByPrice和valuesSortedByIndex會是更好的名字,使得它更清晰地表明你正在返回一個新的排序值列表 – jbat100

相關問題