所以我最近开始使用Automate the Boring the Stuff认真编程,在阅读完基本语法的章节后决定开始制作一个二十一点游戏。但是,我在处理卡片时遇到了问题。我有主甲板
deck=[2,3,4,5,6,7,8,9,'J','Q','K','A']*4
并有一个名为playerHand
的单独空列表。我了解我可以使用.append和random.choice随机挑选一张卡片并将其添加到playerHand[]
,但这并不会从deck[]
中删除这些卡片。
我能想到的唯一方法是随机生成一个数字和卡片中留下的卡片数量,将变量设置为该数字,将另一个变量设置为该索引处的卡片,将该卡片添加到{ {1}},然后最终删除playerHand[]
中该索引处的卡片。
有没有办法做到不涉及2个临时变量?
答案 0 :(得分:4)
是的,请使用list.pop
。
list.pop
将删除给定索引处的值并将其返回:
In [105]: l = [1, 2, 3, 4]
In [106]: l.pop(2) # here 2 is the index, at index 2 we have value 3
Out[106]: 3
In [107]: l
Out[107]: [1, 2, 4]
请注意,默认情况下pop
将弹出最后一个索引(l[-1]
)的值。
因此,在您的情况下,您可以random.shuffle
对列表进行pop
:
In [108]: deck=[2,3,4,5,6,7,8,9,'J','Q','K','A']*4
In [109]: random.shuffle(deck)
In [110]: deck.pop()
Out[110]: 7
答案 1 :(得分:2)
不是随机选择元素,而是随机选择索引。
然后,您可以删除索引上的元素,并使用pop
将其附加到另一个list
一行:
>>> import random
>>> a = [1, 2, 3, 4]
>>> b = []
>>> b.append(a.pop(random.randint(0, len(a))))
>>>
>>> a
[1, 3, 4]
>>> b
[2]