Python中Deck类生成的卡牌索引0结果不稳定问题求助
问题原因
- 你定义
suits和ranks时用了集合(set),集合是无序数据结构,每次程序运行时,迭代集合的顺序都不固定,所以生成卡牌列表的顺序也会随机变化,导致索引0的卡牌不固定。
解决方案
把suits和ranks改成有序的列表(list),并按你期望的顺序排列,这样每次迭代的顺序就固定了。修改后的代码如下:
suits = ['Hearts', 'Diamonds', 'Spades', 'Clubs'] ranks = ['Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace'] values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':11, 'Queen':12, 'King':13, 'Ace':14} #card class class Card(): def __init__(self,suit,rank): self.suit=suit self.rank=rank self.value=values[rank] def __str__(self): return self.rank + ' of ' + self.suit #deck class class Deck(): def __init__(self): self.all_cards = [] for suit in suits: for rank in ranks: self.all_cards.append(Card(suit,rank)) new_deck=Deck() print(new_deck.all_cards[0]) # 现在每次都会输出'Two of Hearts'
额外说明
- 列表是有序容器,迭代时会严格按照定义的顺序遍历,这样生成的卡牌列表顺序就完全可控了。
- 如果需要保留集合的去重特性但又要固定顺序,Python 3.7+的普通字典会保留插入顺序,也可以用
collections.OrderedDict,但这里直接用列表是最简洁的方案。
内容的提问来源于stack exchange,提问作者Karan Verma
相关产品推荐
相关产品推荐

