【问题标题】:Filtering and sorting a class List based on another list in python基于python中的另一个列表过滤和排序一个类List
【发布时间】:2021-10-16 06:14:17
【问题描述】:

我有一个 main_lst,其中包含 5 个 Person 对象:

class Person:
    def __init__(self, col_name, num):
        self.col_name = col_name
        self.num = num

main_lst = []
p1 = Person("A", 5)
p2 = Person("B", 1)
p3 = Person("C", 4)
p4 = Person("D", 3)
p5 = Person("E", 2)

main_lst.append(p1)
main_lst.append(p2)
main_lst.append(p3)
main_lst.append(p4)
main_lst.append(p5)

我有另一个列表只包含str 类型to_be_dropped_lst = ["B", "C"]。如果 col_name 在to_be_dropped_lst 中,我试图首先排除main_lstPerson 对象。然后,我想按照下面预期的排序顺序获取剩余的col_name

["E", "D", "A"]

对于给定的两个输入,是否有一种有效的方法来获取此输出?谢谢。

【问题讨论】:

    标签: python list sorting filter


    【解决方案1】:

    为你的 col_name 定义一个 getter

    def get_col_name(person):
        return person.get('col_name')
    
    for value in main_lst:
      if value.col_name in to_be_dropped_lst:
        main_lst.remove(value)
    
    main_lst.col_name.sort(key = get_col_name ,reverse= True)
    

    【讨论】:

      【解决方案2】:

      创建一个字典,让您通过col 查找Person,这变得非常简单。

      person_by_col = {p.col_name: p for p in main_list}
      
      main_list = [person_by_col[col] for col in ["E", "D", "A"]]
      

      【讨论】:

        【解决方案3】:

        使用理解和attrgetter 作为排序键:

        import operator
        
        class Person:
            def __init__(self, col_name, num):
                self.col_name = col_name
                self.num = num
        
            def __repr__(self):
                "For demonstration purpose."
                return f"Person('{self.col_name}', {self.num})"
        
        >>> sorted([p for p in main_lst if p.col_name not in to_be_dropped_lst],
                   key=operator.attrgetter('num'))
        
        [Person('E', 2), Person('D', 3), Person('A', 5)]
        

        【讨论】:

          猜你喜欢
          • 2011-03-29
          • 2016-09-28
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          • 2016-07-14
          • 1970-01-01
          相关资源
          最近更新 更多