Lew*_*909 5 python collections list namedtuple
我有以下类来创建一副牌:
import collections
Card = collections.namedtuple('Card', ['rank', 'suit', 'value'])
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'spades clubs hearts diamonds'.split()
card_value = [str(n + 1) for n in range(len(ranks))]
def __init__(self):
self._cards = [Card(rank, suit, value)
for suit in self.suits
for rank in self.ranks
for value in self.card_value
]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
if __name__ == '__main__':
FrenchDeck()
Run Code Online (Sandbox Code Playgroud)
我已将value值添加到卡中,以便为每张卡分配一个值,如下所示:
Card(rank='2', suit='spades', value='1')
Card(rank='2', suit='spades', value='2')
Card(rank='2', suit='spades', value='3')
Card(rank='2', suit='spades', value='4')
Card(rank='2', suit='spades', value='5')
Card(rank='2', suit='spades', value='6')
Card(rank='2', suit='spades', value='7')
Card(rank='2', suit='spades', value='8')
Card(rank='2', suit='spades', value='9')
Card(rank='2', suit='spades', value='10')
Card(rank='2', suit='spades', value='11')
Card(rank='2', suit='spades', value='12')
Card(rank='2', suit='spades', value='13')
Run Code Online (Sandbox Code Playgroud)
它为每个套装的每个等级创建 13 个项目。我理解为什么会发生这种情况,但是我正在努力为套装中的每个等级添加价值,如下所示:
Card(rank='2', suit='spades', value='1')
Card(rank='3', suit='spades', value='2')
Card(rank='4', suit='spades', value='3')
Card(rank='5', suit='spades', value='4')
Card(rank='6', suit='spades', value='5')
Card(rank='7', suit='spades', value='6')
Card(rank='8', suit='spades', value='7')
Card(rank='9', suit='spades', value='8')
Card(rank='10', suit='spades', value='9')
Card(rank='J', suit='spades', value='10')
Card(rank='K', suit='spades', value='11')
Card(rank='Q', suit='spades', value='12')
Card(rank='A', suit='spades', value='13')
Run Code Online (Sandbox Code Playgroud)
知道如何实现这一目标吗?
实际上,您并不像您认为的那样嵌套列表迭代。
\n\n更改自
\n\ndef __init__(self):\n self._cards = [Card(rank, suit, value)\n for suit in self.suits\n for rank in self.ranks\n for value in self.card_value\n ]\nRun Code Online (Sandbox Code Playgroud)\n\n到
\n\ndef __init__(self):\n self._cards = [Card(rank, suit, value)\n for suit in self.suits\n for rank, value in zip(self.ranks,\\\n self.card_value)\n ]\nRun Code Online (Sandbox Code Playgroud)\n\n实现你想要的。请注意,这相当于:
\n\ndef __init__(self):\n self._cards = []\n for suit in self.suits:\n for rank, value in zip(self.ranks, self.card_value): \n self._cards+=[Card(rank, suit, value)]\nRun Code Online (Sandbox Code Playgroud)\n\n此外,正如 chepner 所说,或由 J\xc3\xa9r\xc3\xa9my 操作,
\n\n\n\n\n\n
value不是 a 的独立属性Card;它是 的函数rank。
这意味着您可以迭代value的self.card_value每个元素self.suits,然后rank根据value您处理的内容获取相应的元素。
您定义ranks为
ranks = [str(n) for n in range(2, 11)] + list('JQKA')\nRun Code Online (Sandbox Code Playgroud)\n\n然后,基于ranks,您定义card_value如下
card_value = [str(n + 1) for n in range(len(ranks))]\nRun Code Online (Sandbox Code Playgroud)\n\n这清楚地表明了两个对象之间的依赖关系:列表中的每个元素card_value都是列表中每个元素的直接变换/对应ranks。
为了清楚起见,我会s在指针的名称上添加一个免费的符号。self.card_valueIEself.card_values