【问题标题】:How to sort dictionaries of objects by attribute value?如何按属性值对对象的字典进行排序?
【发布时间】:2012-04-20 15:04:19
【问题描述】:

我想以属性排序的方式遍历对象字典

import operator

class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age


studi1 = Student('john', 'A', 15)
studi2 = Student('dave', 'B', 10)
studi3 = Student('jane', 'B', 12)

student_Dict = {}
student_Dict[studi1.name] = studi1
student_Dict[studi2.name] = studi2
student_Dict[studi3.name] = studi3

for key in (sorted(student_Dict, key=operator.attrgetter('age'))):
    print(key)

这给了我错误消息:AttributeError: 'str' object has no attribute 'age'

【问题讨论】:

    标签: python sorting dictionary attributes


    【解决方案1】:
    for student in (sorted(student_Dict.values(), key=operator.attrgetter('age'))):
        print(student.name)
    

    【讨论】:

    • 这会遍历值,按属性排序。这可能是也可能不是您想要的; OP中不太清楚。
    • @KarlKnechtel 绝对正确,OP 中存在一些歧义。我相信这种方法应该比我的更快,尽管我确实认为对键进行排序稍微更清楚。
    • python 2.7 NameError: global name 'operator' is not defined
    【解决方案2】:
    >>> for key in sorted(student_Dict, key = lambda name: student_Dict[name].age):
    ...     print key
    ... 
    dave
    jane
    john
    

    【讨论】:

    • 这会根据对应值的属性对键进行迭代。这可能是也可能不是您想要的; OP中不太清楚。
    • @Karl:我认为这是 OP 根据他们所写的内容寻找的内容。
    【解决方案3】:

    如何在sorted方法的文档中显示

    sorted(student_Dict.keys(), key=lambda student: student.age)
    

    【讨论】:

    • 你没有抓住重点。迭代一个 dict 迭代它的键。我们正在尝试根据对应值的属性对键进行排序。
    【解决方案4】:
    class Student:
        def __init__(self, name, grade, age):
                self.name = name
                self.grade = grade
                self.age = age
        def __repr__(self):
                return repr((self.name, self.grade, self.age))
    
    
    student_objects = [
        Student('john', 'A', 15),
        Student('jane', 'B', 12),
        Student('dave', 'B', 10),
    ]
    print student_objects
    student_objects.sort(key=attrgetter('age'))
    print student_objects
    

    来源:https://wiki.python.org/moin/HowTo/Sorting

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2013-02-12
      • 2023-04-03
      • 2016-02-08
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多