在类中使用命名存根

我正在练习奥雷利的书《流利的蟒蛇》中的一段代码。


这段代码如下所示:


import collections


    Card= collections.namedtuple('Card',['rank','suit']);


    class FrenchDeck:

        ranks=[str(n) for n in range (2,11)]+ list('JQKA')

        suits= 'spades diamonds clubs hearts'.split()


        def __init__(self):

            self._cards= [Card(rank,suit)   for rank in self.ranks

                                            for suit in self.suits]

        def __len__(self):

            return len(self._cards)


        def __getitem__(self,position):

            return self._cards[position]

我可以看到如何使用命名tuple的功能将排名中的每个值分配给所有套装。


作为我自己的实践之一,我想寻求有关在此范式中分配值的帮助。具体来说,在此代码段中,与其给一个学生四个成绩,不如使用命名tuple功能为一个学生分配各自独特的成绩的方法是什么?(例如约翰-89,杰伊-98,乔-87,约瑟夫-91)。我从书中的样本中反刍的方式仍将把所有成绩分配给每个学生。非常感谢您的关注和帮助!


Student= collections.namedtuple('Student',['name','grade'])


studentname=["John","Jay","Joe","Joseph"]


class grade: 

    names= studentname

    grades=[89,98,87,91]


    def __init__(self):

        self._stud=[

        Student(name,grade) for name in self.names 

                            for grade in self.grades ]  


    def __len__(self):

        return len(self._stud)


    def __getitem__(self,position):

        return self._stud[position]


跃然一笑
浏览 118回答 2
2回答

慕妹3242003

在书中的代码中,每套西装都有每一个价值——它是西装和价值的笛卡尔积。在您的代码中,您只需要从学生到成绩的一对一映射。这通常使用 zip() 完成。您可以使用,这将为您提供相应的对。然后,您可以获取以下列表:zip(self.names, self.grades)Studentsself._stud=[Student(n, g) for n, g in zip(self.names, self.grades)]您也可以将班级设置为不依赖于全局变量,并使用如下内容获取学生和成绩列表:import collectionsStudent = collections.namedtuple('Student',['name','grade'])studentname = ["John","Jay","Joe","Joseph"]grades = [89,98,87,91]class Grades:     def __init__(self, names, grades):        self._stud = [Student(n, g) for n, g in zip(names, grades)]    def __len__(self):        return len(self._stud)    def __getitem__(self,position):        return self._stud[position]g = Grades(studentname, grades)g._stud将是:[  Student(name='John', grade=89),  Student(name='Jay', grade=98),  Student(name='Joe', grade=87),  Student(name='Joseph', grade=91)]

慕后森

这与命名元组没有任何关系。使用卡,您可以使用 和 的每个元素创建一个新实例。Cardrankssuits对于 ,您希望使用压缩结果中的每个元素并一起创建一个新实例。gradeStudentnamesgradesdef __init__(self):     self._stud=[Student(name,grade)                  for name, grade in zip(self.names, self.grades)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java