【问题标题】:How to sort output while looping through dictionary by member variable? [duplicate]如何在按成员变量遍历字典时对输出进行排序? [复制]
【发布时间】:2013-11-27 07:48:28
【问题描述】:

如何按成员变量对字典进行排序

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

我想显示按索引或价格排序的商品信息。

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

【问题讨论】:

    标签: python sorting


    【解决方案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)]
    

    输出

    [('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)]
    

    【讨论】:

    • 为什么不只是[item[1].items() for item in sorted(d.items(), key=lambda x: x[1].index)]?在dict 上进行大量查找似乎没有必要。
    • @Lattyware 改变了它。我们甚至不需要items(),我用过values() :)
    • 确实,看起来不错。 +1。
    • @Lattyware 谢谢 :) 我用attrgetter 概括了:)
    • lambda x: getter(x)) 有点不合时宜——getter 会做同样的事情。
    【解决方案2】:

    python中的字典没有任何顺序。

    对于你想要的,可以通过以下方式实现:

    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)
    

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    • @ShivanRaptor:是的,那是我缺乏耐心。现已修复。
    【解决方案3】:

    更难,但更普遍

    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()
    

    【讨论】:

    • 也许 valuesSortedByPrice 和 valuesSortedByIndex 会是更好的名称,让您更清楚地知道您正在返回一个新的排序值列表
    猜你喜欢
    • 2013-03-14
    • 2020-08-03
    • 2019-04-21
    • 2021-06-28
    • 2012-08-09
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多