在 class 中使用 namedtuple
Using namedtuple in class
我正在练习 O'Reily 书中的一段代码 Fluent 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'.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]
这与命名元组没有任何关系。使用卡片,您使用 ranks
和 suits
.
的 product 的每个元素创建了一个新的 Card
实例
对于 grade
,您想使用 zipping names
和 [= 的结果中的每个元素创建一个新的 Student
实例17=]在一起。
def __init__(self):
self._stud=[Student(name,grade)
for name, grade in zip(self.names, self.grades)]
在书中的代码中,每套西装都有每一种价值——它是西装和价值的笛卡尔乘积。在您的代码中,您只需要从学生到成绩的一对一映射。这通常使用 zip()
完成。您可以使用 zip(self.names, self.grades)
,这将为您提供相应的对。然后,您可以使用
获得 Students
的列表
self._stud=[Student(n, g) for n, g in zip(self.names, self.grades)]
您也可以制作 class,这样它就不会依赖于全局变量,而是采用类似以下内容的学生和成绩列表:
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)
]
我正在练习 O'Reily 书中的一段代码 Fluent 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'.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]
这与命名元组没有任何关系。使用卡片,您使用 ranks
和 suits
.
Card
实例
对于 grade
,您想使用 zipping names
和 [= 的结果中的每个元素创建一个新的 Student
实例17=]在一起。
def __init__(self):
self._stud=[Student(name,grade)
for name, grade in zip(self.names, self.grades)]
在书中的代码中,每套西装都有每一种价值——它是西装和价值的笛卡尔乘积。在您的代码中,您只需要从学生到成绩的一对一映射。这通常使用 zip()
完成。您可以使用 zip(self.names, self.grades)
,这将为您提供相应的对。然后,您可以使用
Students
的列表
self._stud=[Student(n, g) for n, g in zip(self.names, self.grades)]
您也可以制作 class,这样它就不会依赖于全局变量,而是采用类似以下内容的学生和成绩列表:
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)
]