【问题标题】:Sorting objects using CSV data使用 CSV 数据对对象进行排序
【发布时间】:2020-04-17 02:07:19
【问题描述】:

在我开始之前我是菜鸟

所以,我使用 CSV 文件中的数据制作了对象,该文件的格式为“doe,john,m,20”,如下所示:

class FitClinic:
    def __init__(self, lname, fname, gender, age):
        self.__lname = lname
        self.__fname = fname
        self.__gender = gender
        self.__age = age

    def __del__(self):
        print("Customer has been deleted")

    def set_lname(self):
        pass

    def get_lname(self):
        return self.__lname

    def set_fname(self):
        pass

    def get_fname(self):
        return self.__fname

    def set_gender(self):
        pass

    def get_gender(self):
        return self.__gender

    def set_age(self):
        pass

    def get_age(self):
        return self.__age

fh=open('fit_clinic_20.csv', 'r')
fh.seek(3)
listofcustomers=[]
for row in fh:
    c = row.split(",")
    listofcustomers.append(FitClinic(c[0], c[1], c[2], c[3:]))

我需要做的是通过 fname 属性对这些对象进行排序,我不知道该怎么做,请帮助,谢谢。

【问题讨论】:

    标签: python python-3.x csv sorting object


    【解决方案1】:

    您可以将sortedkey 一起使用

    sorted_list=sorted(listofcustomers,key=lambda x: x.get_fname())
    

    参考Sorting HOW TO

    要检查结果,您可以使用您已实现的方法打印信息:

    for x in sorted_list:
        print(x.get_fname())
    

    在@Maurice Reeves 建议的更复杂的情况下,您还可以添加__str____repr__ 方法。

    def __str__(self):
        str_to_print=f'lname:{self.__lname},'
        str_to_print+=f'fname:{self.__fname},'
        str_to_print+=f'gender:{self.__gender},'
        str_to_print+=f'age:{self.__age}'
        return str_to_print
    
    __repr__=__str__
    

    然后您可以通过以下方式打印:

    for x in sorted_list:
         print(x)
    

    请参阅Python doc

    顺便说一句,您可以使用pandas 方便地加载csv文件。

    import pandas
    csv_pd=pandas.read_csv('fit_clinic_20.csv')
    csv_pd.sort_values(by=['fname']) # If fname is the head of your csv file. If not, just add it.
    

    参考pandas.DataFrame.sort_values

    【讨论】:

    • 是的,我已经尝试过这种方法,但是我得到了一个奇怪的输出,类似于:[<__main__.fitclinic object at>, <__main__.fitclinic object at>, <__main__. fitclinic>,<__main__.fitclinic>,<__main__.fitclinic>,<__main__.fitclinic>,<__main__.fitclinic>,<__main__.fitclinic>,<__x04__.fitclinic> , <__main__.fitclinic object at>, <__main__.fitclinic object at>, <__main__.fitclinic object at>, <__main__.fitclinic object at>
    • 没错。如果您想获得更多信息,只需打印每个对象。 for x in sorted_list: print(x.get_fname())
    • @osmans - 您需要实现 str 方法以获取 FitClinic 对象的人类可读版本:journaldev.com/22460/python-str-repr-functions
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多