Python生成扑克牌组时嵌套循环仅提取部分元素问题求助
问题根因
你遇到的交替取元素、下标越界两个问题,都来自测试代码中pop(i)的错误使用,和生成牌组的嵌套循环逻辑无关。
交替取元素的原因
初始牌组共52张,下标范围是0~51:
- 第一次循环i=0,
pop(0)取出原下标0的元素后,剩余所有元素会整体前移一位,原下标1的元素变成新的下标0,原下标2的元素变成新的下标1,以此类推 - 第二次循环i=1,取出的是新下标1对应的原下标2的元素
- 以此类推,每次取出的都是原序列下标为0、2、4...的元素,自然呈现交替取值的现象
下标越界的原因
每执行一次pop操作,牌组列表的长度就减1:
- 循环执行26次后,牌组只剩52-26=26个元素,最大有效下标是25
- 如果range设置大于26,比如27,当i=26时,
pop(26)就会因为超出当前列表的下标范围报错
修复方案
方案1:按顺序取前N张
把测试代码的pop(i)改为pop(0),只要range参数不超过52就不会越界:
#testing area blah = [] for i in range(26): card = game.deck.cards.pop(0) print(card.suit) blah.append(card.value) print(str(blah))
方案2:更高效的切片写法
避免多次移动列表元素,性能更优:
#testing area take_count = 26 take_cards = game.deck.cards[:take_count] game.deck.cards = game.deck.cards[take_count:] blah = [card.value for card in take_cards] for card in take_cards: print(card.suit) print(str(blah))
额外问题修复
你当前的Card类__str__方法会触发类型错误,因为value属性是类似["Two", 2]的列表,不能直接和字符串拼接,需要修改为:
def __str__(self): return self.value[0] + " of " + self.suit
内容的提问来源于stack exchange,提问作者Portocan
相关产品推荐
相关产品推荐

