Python 在类中使用namedtuple
我正在练习O'Reily的《流畅Python》一书中的一段代码 代码如下所示:Python 在类中使用namedtuple,python,python-3.x,magic-methods,Python,Python 3.x,Magic Methods,我正在练习O'Reily的《流畅Python》一书中的一段代码 代码如下所示: 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'.spli
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]
我可以看到namedtuple的特性是如何被用来将等级中的每个值分配给所有套装的
作为我自己的实践之一,我想寻求关于在这个范例中分配值的帮助。具体地说,在这个片段中,不是给一个学生四个等级,而是如何使用namedtuple特性为一个学生分配他们各自的唯一等级?(例如John-89、Jay-98、Joe-87、Joseph-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]
这实际上与命名元组没有任何关系。使用这些卡,您使用
等级
和套装
产品的每个元素创建了一个新的卡
实例
对于grade
,您希望使用压缩名称
和成绩
的结果中的每个元素创建一个新的学生
实例
def __init__(self):
self._stud=[Student(name,grade)
for name, grade in zip(self.names, self.grades)]
这实际上与命名元组没有任何关系。使用这些卡,您使用
等级
和套装
产品的每个元素创建了一个新的卡
实例
对于grade
,您希望使用压缩名称
和成绩
的结果中的每个元素创建一个新的学生
实例
def __init__(self):
self._stud=[Student(name,grade)
for name, grade in zip(self.names, self.grades)]
在书中的代码中,每件西装都有每一个价值——它是西装和价值的笛卡尔乘积。在代码中,您只需要从学生到年级的一对一映射。这通常是通过以下方式完成的。您可以使用
zip(self.names,self.grades)
,这将为您提供相应的对。然后,您可以使用
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.\u螺栓将为:
[
Student(name='John', grade=89),
Student(name='Jay', grade=98),
Student(name='Joe', grade=87),
Student(name='Joseph', grade=91)
]
在书中的代码中,每件西装都有每一个价值——它是西装和价值的笛卡尔乘积。在代码中,您只需要从学生到年级的一对一映射。这通常是通过以下方式完成的。您可以使用zip(self.names,self.grades)
,这将为您提供相应的对。然后,您可以使用
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.\u螺栓将为:
[
Student(name='John', grade=89),
Student(name='Jay', grade=98),
Student(name='Joe', grade=87),
Student(name='Joseph', grade=91)
]
[学生(姓名,成绩)代表姓名,zip中的成绩(姓名,成绩)]
或者你可以迭代索引并抓取姓名[i]
和成绩[i]
[学生(姓名,成绩)代表姓名,zip中的成绩(姓名,成绩)]
或者你可以迭代索引并抓取姓名[i]
和成绩[i]