Python如何从列表中删除指定元素?现有抽牌代码运行失败如何修复?
问题原因分析
- 第一个是语法错误:
list.remove()是列表的内置方法,调用时必须使用圆括号包裹参数,你代码中写的Deck.remove[Card0]误用了方括号,属于语法错误,运行时会直接抛出TypeError: 'builtin_function_or_method' object is not subscriptable异常。 - 第二个是逻辑错误:你设置了
range(52)的循环,每次循环要抽取5张牌,但整副牌只有52张,循环到第11次时牌堆就已经为空,再调用random.choice()会抛出IndexError: Cannot choose from an empty sequence异常,完全不需要循环52次,最多循环10次就会耗尽牌堆。
正确实现方式
方法1:修改原有代码逻辑
import random Deck = ['1♤', '2♤', '3♤', '4♤', '5♤', '6♤', '7♤', '8♤', '9♤', 'J♤', 'Q♤', 'K♤', 'A♤', '1♧', '2♧', '3♧', '4♧', '5♧', '6♧', '7♧', '8♧', '9♧', 'J♧', 'Q♧', 'K♧', 'A♧', '1♡', '2♡', '3♡', '4♡', '5♡', '6♡', '7♡', '8♡', '9♡', 'J♡', 'Q♡', 'K♡', 'A♡', '1♢', '2♢', '3♢', '4♢', '5♢', '6♢', '7♢', '8♢', '9♢', 'J♢', 'Q♢', 'K♢', 'A♢'] # 牌堆剩余牌数≥5时才继续抽 while len(Deck) >= 5: Card0 = random.choice(Deck) Deck.remove(Card0) Card1 = random.choice(Deck) Deck.remove(Card1) Card2 = random.choice(Deck) Deck.remove(Card2) Card3 = random.choice(Deck) Deck.remove(Card3) Card4 = random.choice(Deck) Deck.remove(Card4) print(Card0, Card1, Card2, Card3, Card4)
方法2:更简洁高效的写法(推荐)
直接用random.sample()方法可以一次性从列表中抽取指定数量的不重复元素,不需要手动逐个删除,代码更简洁性能也更好:
import random Deck = ['1♤', '2♤', '3♤', '4♤', '5♤', '6♤', '7♤', '8♤', '9♤', 'J♤', 'Q♤', 'K♤', 'A♤', '1♧', '2♧', '3♧', '4♧', '5♧', '6♧', '7♧', '8♧', '9♧', 'J♧', 'Q♧', 'K♧', 'A♧', '1♡', '2♡', '3♡', '4♡', '5♡', '6♡', '7♡', '8♡', '9♡', 'J♡', 'Q♡', 'K♡', 'A♡', '1♢', '2♢', '3♢', '4♢', '5♢', '6♢', '7♢', '8♢', '9♢', 'J♢', 'Q♢', 'K♢', 'A♢'] while len(Deck) >= 5: # 一次性抽取5张不重复的牌 hand = random.sample(Deck, 5) # 从牌堆中移除已抽出的牌 for card in hand: Deck.remove(card) print(*hand)
del关键字的正确用法
如果要使用del关键字删除元素,需要先获取要删除元素的索引,写法如下:
idx = Deck.index(Card0) del Deck[idx]
这种方式和remove的效果一致,区别是remove直接按值删除,del按索引删除。
内容的提问来源于stack exchange,提问作者Ezekiel White
相关产品推荐
相关产品推荐

