NamedTuple 作为最通用的 String 数据类型

NamedTuple as String data types most versatile

from collections import namedtuple
Data=namedtuple('Data','name number age cgpa')#best to keep all data types as string
def prettyprint(X,end="\n"):
    s="{0},{1},{2},{3}".format(X.name,X.number,X.age,X.cgpa)
    print(s,end=end)
file_name=r"""C:\Users\DELL\OneDrive\Desktop\Students Data.txt"""
file=open(file_name,'r')
List=[]
for i in file.readlines():
    temp=[j.rstrip().lstrip() for j in i.split(',')]
    List.append(tuple(temp))
Students=list(map(lambda x:Data(*x),List))
Sort_cgpa=sorted(Students,key=lambda x:(float(x.cgpa),x.name,int(x.number[-4:]),int(x.age)),reverse=True)
for out in Sort_cgpa:
    prettyprint(out)

Students Data.txt 包含学生姓名、人数、年龄、CGPA 的数据。 事情是我将使用 age 作为 int 和 cgpa 作为 float 变量 我可以毫无问题地将所有数据类型用作字符串并将数据类型转换为所需的任何时间。因此,最好的方法是将 namedtuple 用作像字符串这样的单一数据类型。

请注意,虽然我可以更改

temp_new=[[i[0],i[1],int(i[2]),float(i[3])] for i in temp]
List.append(temp_new)

我的问题不是针对这段代码我想知道有没有办法改变 init(self) 以便我可以使用 self.age =int(self.age) 或者最好将所有数据类型都用作字符串

如果您希望能够自动转换输入值,我会使用 dataclass 而不是 namedtuple。文档在这里:https://docs.python.org/3/library/dataclasses.html

如果你定义了一个数据class,你可以覆盖一个名为__post_init__的方法。在 init 方法是 运行.

之后自动调用
from dataclasses import dataclass

@dataclass
class Student:
    name: str
    number: int
    age: int
    cgpa: int

    def __post_init__(self):
        self.age = int(self.age)

使用 Student class,您可以看到现在转换了年龄

>>> Student("Joe", "10", "12", "4.0")
Student(name='Joe', number='10', age=12, cgpa='4.0')