我已经创建了一个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))
快速的但是我能避免列出一系列的清单吗?