代码之家  ›  专栏  ›  技术社区  ›  WeCanDoItGuys

使用列表理解创建一副多副牌[重复]

  •  0
  • WeCanDoItGuys  · 技术社区  · 1 年前

    我已经创建了一个Card对象:

    class Card:
        def __init__(self, rank, suit, d=0): 
            self.rank = rank
            self.suit = suit
            self.deck_index = d
    

    我可以使用列表理解法制作一个代表标准牌组的牌列表:

    ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
    suits = ['hearts', 'clubs', 'diamonds', 'spades']
    deck = ([Card(r, s) for r in ranks for s in suits] + 
            [Card('Joker', 'black'), Card('Joker', 'red')])
    

    我想创建一个卡片列表,表示N组组合,使用列表理解。


    我可以用for循环来完成:

    decks = []
    for i in range(N):
        decks += ([Card(r, s, d=i) for r in ranks for s in suits] +
                  [Card('Joker', ' black', i), Card('Joker', 'red', i)])
    

    但如果我把这个循环写成列表理解,我会得到一个列表列表,而不是卡片列表:

    decks = [[Card(r, s, d=i) for r in ranks for s in suits] + 
             [Card('Joker', 'black', i), Card('Joker', 'red', i)] 
             for i in range(N)]
    

    我试着把目标放在括号里,然后用*把它拆开。我得到了错误: Iterable unpacking cannot be used in comprehension

    我可以对没有小丑的牌组使用列表理解,并用他们自己的列表理解分别添加小丑:

    decks = ([Card(r, s, i) for r in ranks for s in suits for i in range(N)] + 
             [Card('Joker', 'black', i) for i in range(N)] + 
             [Card('Joker', 'red', i) for i in range(N)])
    

    但这冗余地指定了循环三次。

    它还将小丑放在最后,而不是保留原来的顺序,小丑放在自己牌组的牌旁边。这一点并不太重要,因为我在下一步中会打乱顺序,但我想知道是否有可能使用列表理解将牌组与保留的顺序组合起来。


    我会这样陈述一般问题:

    lst = lst1 + lst2 是元素列表

    lsts = [lst1(i) + lst2(i) for i in range(N)] 是列表列表

    如何使用列表理解在中创建元素列表 lst1(i) + lst2(i) 对于范围(N)中的i?

    该解决方案可能在网上提供,但我不知道该搜索什么单词。“使用列表理解组合列表的总和”提供了列表理解教程以及如何按元素对列表进行总和。 我发现的一个选择是让它列出一个列表,然后 flatten that 使用 sum(lst,[]) (缓慢)或 list(itertools.chain.from_iterable(lst)) 快速的但是我能避免列出一系列的清单吗?

    1 回复  |  直到 1 年前
        1
  •  1
  •   no comment Pratyush Goutam    1 年前

    这将创建与您的“for loop”解决方案相同的解决方案:

    decks = [
        Card(r, s, i)
        for i in range(N)
        for rs, ss in [
            (ranks, suits),
            (['Joker'], ['black', 'red'])
        ]
        for r in rs for s in ss
    ]
    

    Attempt This Online!

    由于我的清单上有两个“产品规格”,每个都是一样的 i ,它可以预先建造一次,然后(重新)用于每个 。但与整体工作量/产出相比,它相对较小,所以我保持简单。

    推荐文章