Python - 如何使用列表理解来填充命名元组值

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)

知道如何实现这一目标吗?

kee*_*ive 3

实际上,您并不像您认为的那样嵌套列表迭代。

\n\n

更改自

\n\n
def __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                   ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
def __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                   ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

实现你想要的。请注意,这相当于:

\n\n
def __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)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,正如 chepner 所说,或由 J\xc3\xa9r\xc3\xa9my 操作,

\n\n
\n

value不是 a 的独立属性Card;它是 的函数rank

\n
\n\n

这意味着您可以迭代valueself.card_value每个元素self.suits,然后rank根据value您处理的内容获取相应的元素。

\n\n

更多细节

关注您的评论/问题

\n\n

您定义ranks

\n\n
ranks = [str(n) for n in range(2, 11)] + list('JQKA')\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,基于ranks,您定义card_value如下

\n\n
card_value = [str(n + 1) for n in range(len(ranks))]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这清楚地表明了两个对象之间的依赖关系:列表中的每个元素card_value都是列表中每个元素的直接变换/对应ranks

\n\n

为了清楚起见,我会s在指针的名称上添加一个免费的符号。self.card_valueIEself.card_values

\n