为了账号安全,请及时绑定邮箱和手机立即绑定

在类中使用命名存根

在类中使用命名存根

跃然一笑 2022-09-27 16:23:03
我正在练习奥雷利的书《流利的蟒蛇》中的一段代码。这段代码如下所示: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]
查看完整描述

2 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

在书中的代码中,每套西装都有每一个价值——它是西装和价值的笛卡尔积。在您的代码中,您只需要从学生到成绩的一对一映射。这通常使用 zip() 完成。您可以使用,这将为您提供相应的对。然后,您可以获取以下列表:zip(self.names, self.grades)Students

self._stud=[Student(n, g) for n, g in zip(self.names, self.grades)]

您也可以将班级设置为不依赖于全局变量,并使用如下内容获取学生和成绩列表:


import collections


Student = 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)

]




查看完整回答
反对 回复 2022-09-27
?
慕后森

TA贡献1802条经验 获得超5个赞

这与命名元组没有任何关系。使用卡,您可以使用 和 的每个元素创建一个新实例。Cardrankssuits

对于 ,您希望使用压缩结果中的每个元素并一起创建一个新实例。gradeStudentnamesgrades

def __init__(self):
    self._stud=[Student(name,grade) 
                for name, grade in zip(self.names, self.grades)]


查看完整回答
反对 回复 2022-09-27
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号