【问题标题】:How to sort objects and attributes by date?如何按日期对对象和属性进行排序?
【发布时间】:2023-03-22 12:14:01
【问题描述】:

我有下一个代码:

class Petshop():
    def __init__(self, entryDate, name, ownerName):
        self.entryDate = entryDate
        self.name = name
        self.ownerName = ownerName

class Pets():
    def __init__(self):
        self.petsList = []
    
    def addPets(self, entryDate, name, ownerName):
        entry_pet = Petshop(entryDate, name, ownerName)
        self.petsList.append(entry_pet)
    
    def printPets(self):
        for pet in self.petsList:
            if pet.entryDate == pet.entryDate:#Here I try to sort by date
                print("---------------",pet.entryDate,'------------------')
                print("Name:", pet.name)
                print("Owner name:", pet.ownerName)

pet = Pets()

pet.addPets('04/13/2021','Pinky', 'David Smith')
pet.addPets('07/10/2020', 'Charlie', 'Joe Davis')
pet.addPets('12/22/2018', 'Teddy', 'Carl Johnson')
pet.addPets('07/10/2020', 'Kenny', 'Susan Jones')
pet.addPets('04/13/2021','Max', 'Bryan Miller')
pet.addPets('07/10/2020', 'Buddy', 'Kathy Brown')
pet.printPets()

使用该代码我想按日期对宠物条目进行排序,因此例如我希望打印下一个:

--------------- 04/13/2021 ------------------
Name: Pinky
Owner name: David Smith
Name: Max
Owner name: Bryan Miller
--------------- 07/10/2020 ------------------
Name: Charlie
Owner name: Joe Davis
Name: Kenny
Owner name: Susan Jones
Name: Buddy
Owner name: Kathy Brown
--------------- 12/22/2018 ------------------
Name: Teddy
Owner name: Carl Johnson

但我不是这样打印每个对象,这不是我所期望的:

--------------- 04/13/2021 ------------------
Name: Pinky
Owner name: David Smith
--------------- 07/10/2020 ------------------
Name: Charlie
Owner name: Joe Davis
--------------- 12/22/2018 ------------------
Name: Teddy
Owner name: Carl Johnson
--------------- 07/10/2020 ------------------
Name: Kenny
Owner name: Susan Jones
--------------- 04/13/2021 ------------------
Name: Max
Owner name: Bryan Miller
--------------- 07/10/2020 ------------------
Name: Buddy
Owner name: Kathy Brown

我尝试在printPets() 中进行某种排序,但它不起作用。 所以我来这里寻求帮助。谢谢!

【问题讨论】:

  • 你为什么期望在所有宠物的循环中比较一个宠物的 entryDate 与它自己,以对任何东西进行排序?你也没有做任何分组,你得到的输出不应该是意外的。
  • 如果您使用datetime 对象来存储您的日期,您可以使用datetime 对象的排序属性,而无需使用字符串。

标签: python list sorting dictionary oop


【解决方案1】:

您可以在创建 petsList 时导入 datetime 并比较日期:

from datetime import datetime

def getDateFromStr(date):
    date_list = []
    for i in date.split('/'):
        date_list.append(int(i))
    # date_list = list(map(lambda x: int(x), date.split('/')))
    return datetime(date_list[2], date_list[0], date_list[1]).date()

class Petshop():
    def __init__(self, entryDate, name, ownerName):
        self.entryDate = entryDate
        self.name = name
        self.ownerName = ownerName

class Pets():
    def __init__(self):
        self.petsList = []
    
    def addPets(self, entryDate, name, ownerName):
        entry_pet = Petshop(entryDate, name, ownerName)
        # creating petsList sorted by date already
        if len(self.petsList) == 0:
            self.petsList.append(entry_pet)
        else:
            for i, pet in enumerate(self.petsList):
                if getDateFromStr(pet.entryDate) < getDateFromStr(entryDate):
                    self.petsList.insert(i, entry_pet)
                    break
                elif i == len(self.petsList) - 1:
                    self.petsList.append(entry_pet)
                    break
    
    def printPets(self):
        for pet in self.petsList:
            if pet.entryDate == pet.entryDate:#Here I try to sort by date
                print("---------------",pet.entryDate,'------------------')
                print("Name:", pet.name)
                print("Owner name:", pet.ownerName)

pet = Pets()

pet.addPets('04/13/2021','Pinky', 'David Smith')
pet.addPets('07/10/2020', 'Charlie', 'Joe Davis')
pet.addPets('12/22/2018', 'Teddy', 'Carl Johnson')
pet.addPets('07/10/2020', 'Kenny', 'Susan Jones')
pet.addPets('04/13/2021','Max', 'Bryan Miller')
pet.addPets('07/10/2020', 'Buddy', 'Kathy Brown')
pet.printPets()

【讨论】:

    【解决方案2】:

    itertools.groupby 就是你要找的东西:

        def printPets(self):
            self.petsList.sort(key=lambda p: p.entryDate)
            for group in groupby(self.petsList, key=lambda p: p.entryDate):
                ls = list(group)
                print("---------------", ls[0], '------------------')
                for pet in list(ls[1]):
                    print("Name:", pet.name)
                    print("Owner name:", pet.ownerName)
    

    【讨论】:

      【解决方案3】:

      您可以将sorted() 与作为key 的参数传递的lambda 函数一起使用。编辑:这段代码应该完全符合您的期望。即每个不同的日期打印一个输入日期。

          def printPets(self):
            for inputdate in sorted(list(set(i.entryDate for i in self.petsList))):
                print("---------------",inputdate,'------------------')
                for pet in list(filter(lambda x: x.entryDate == inputdate, self.petsList)):
                  print("Name:", pet.name)
                  print("Owner name:", pet.ownerName)
      

      【讨论】:

        【解决方案4】:

        您必须将魔术方法 __lt__ 添加到您的类中才能进行排序。

        class Petshop():
            def __init__(self, entryDate, name, ownerName):
                self.entryDate = entryDate
                self.name = name
                self.ownerName = ownerName
        
            def __lt__(self, other):
                return self.entryDate < other.entryDate
        
        
        class Pets():
            def __init__(self):
                self.petsList = []
        
            def addPets(self, entryDate, name, ownerName):
                entry_pet = Petshop(entryDate, name, ownerName)
                self.petsList.append(entry_pet)
        
            def printPets(self):
                for pet in sorted(self.petsList):
                    if pet.entryDate == pet.entryDate:  # Here I try to sort by date
                        print("---------------", pet.entryDate, '------------------')
                        print("Name:", pet.name)
                        print("Owner name:", pet.ownerName)
        
        
        pet = Pets()
        
        pet.addPets('04/13/2021', 'Pinky', 'David Smith')
        pet.addPets('07/10/2020', 'Charlie', 'Joe Davis')
        pet.addPets('12/22/2018', 'Teddy', 'Carl Johnson')
        pet.addPets('07/10/2020', 'Kenny', 'Susan Jones')
        pet.addPets('04/13/2021', 'Max', 'Bryan Miller')
        pet.addPets('07/10/2020', 'Buddy', 'Kathy Brown')
        pet.printPets()
        

        【讨论】:

        • 添加__lt__ 而不添加__eq__ 不是解决方案。
        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        相关资源
        最近更新 更多