Python数组提取奇偶索引元素最优方案及卡牌游戏代码报错排查
解决卡牌分配问题:修复报错并实现最优方案
首先咱们先搞定你遇到的报错问题,再聊聊最顺手的实现方式。
为什么会出现'NoneType' object is not subscriptable报错?
你代码里这行是核心问题:
deck = random.shuffle(deck)
random.shuffle()是原地修改列表的函数,它本身不会返回新列表,返回值是None。你把这个None赋值给了deck,直接把原本的卡牌列表覆盖成了空值,后面调用函数时试图对None做切片操作,自然就报错了。
修复超简单,去掉赋值,直接调用shuffle就行:
random.shuffle(deck)
你的filter用法为啥不对?
filter()的正确用法是先传一个判断函数,再传可迭代对象,它会筛选出让判断函数返回True的元素。但你直接传了deck[::2],完全不符合它的参数逻辑——而且你根本不需要用filter,Python的列表切片就能完美解决你的需求。
最优实现方案
你的需求是玩家1拿偶数索引(0、2、4…)的卡牌,玩家2拿奇数索引(1、3、5…)的卡牌,用切片就能一步到位,甚至不需要额外写函数(当然要封装也没问题)。
完整修正后的代码
import random colours = ['RED', 'BLACK', 'YELLOW'] # 注意:randint(1,30)才会生成1-30的编号,你之前写的31会包含31哦 deck = [(random.randint(1, 30), random.choice(colours)) for _ in range(30)] # 原地打乱卡组,不要赋值 random.shuffle(deck) print("打乱后的完整卡组:", deck) # 用切片直接分配,简洁高效 player1_cards = deck[::2] # 从索引0开始,步长2,取所有偶数索引的卡牌 player2_cards = deck[1::2] # 从索引1开始,步长2,取所有奇数索引的卡牌 print("\n玩家1的卡牌:", player1_cards) print("玩家2的卡牌:", player2_cards)
可选:封装成可复用函数
如果需要把分配逻辑封装成函数方便复用,写法也很直观:
def get_player_cards(deck, player_number): if player_number == 1: return deck[::2] elif player_number == 2: return deck[1::2] else: raise ValueError("玩家编号只能是1或2") # 使用示例 player1 = get_player_cards(deck, 1) player2 = get_player_cards(deck, 2)
内容的提问来源于stack exchange,提问作者Rapha Nash
相关产品推荐
相关产品推荐

