gpt4 book ai didi

python - 一副纸牌的随机迭代

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:33 25 4
gpt4 key购买 nike

我正在尝试随机遍历一副纸牌而不重复。

代码如下:

import random

class Cards:

# Where prefix d is Diamonds, h is Hearts, s is Spades and c is Clubs
total_cards = [{2: 'd2', 3: 'd3', 4: 'd4', 5: 'd5', 6: 'd6', 7: 'd7', 8: 'd8', 9: 'd9', 10: 'd10', 11: 'dJack',
12: 'dQueen', 13: 'dKing', 14: 'dAce'},
{2: 'h2', 3: 'h3', 4: 'h4', 5: 'h5', 6: 'h6', 7: 'h7', 8: 'h8', 9: 'h9', 10: 'h10', 11: 'hJack',
12: 'hQueen', 13: 'hKing', 14: 'hAce'},
{2: 's2', 3: 's3', 4: 's4', 5: 's5', 6: 's6', 7: 's7', 8: 's8', 9: 's9', 10: 's10', 11: 'sJack',
12: 'sQueen', 13: 'sKing', 14: 'sAce'},
{2: 'c2', 3: 'c3', 4: 'c4', 5: 'c5', 6: 'c6', 7: 'c7', 8: 'c8', 9: 'c9', 10: 'c10', 11: 'cJack',
12: 'cQueen', 13: 'cKing', 14: 'cAce'}]

def random_pick(self): # Method to randomly pick a card from the deck

choice = random.choice(random.choice(self.total_cards))

for v in self.total_cards: # to retrieve the corresponding `key` for `choice`
for i in v.values():
if choice == i:
k = v[i]
v.pop(k)

print(choice) # To print the random card picked from the deck
print(self.total_cards) # To print the updated Deck after picking the card


c = Cards()
c.random_pick()

我的想法是,一旦牌被选中,它就应该从牌组中移除。

这是错误:

Traceback (most recent call last):
File "F:/Blackjack/Base/Cards.py", line 30, in <module>
c.random_pick()
File "F:/Blackjack/Base/Cards.py", line 17, in random_pick
choice = random.choice(random.choice(self.total_cards))
File "C:\Users\Python\Python37-32\lib\random.py", line 262, in choice
return seq[i]
KeyError: 0

根据我的理解,KeyError 是在现有键集中找不到映射(字典)键时引发的异常。但是我的 IF LOOP 只有在条件 choice == i 时才为 TRUE,只有那时 pop() 才应该被启动。

我已经尝试过上面的代码,但代码中没有 pop() 方法,代码工作正常,每次运行后都会生成随机卡片。

最佳答案

如果您多次尝试您的代码,您会发现您不会每次都遇到此错误。有时会越线

        choice = random.choice(random.choice(self.total_cards))

稍后在代码中遇到另一个错误。

这是怎么回事?我假设 random.choice(self.total_cards) 工作正常并返回 total_cards 列表中的四副牌之一。您将该套牌表示为字典。

让我们看看 random.choice 在一个更简单的例子中对字典做了什么:

>>> import random
>>>
>>> random.seed(0) # for reproducability
>>> random.choice({1:2, 3:4})
2

咦,奇怪,它返回了其中一个值。我期望其中一个键,例如在不调用 .items().values() 的情况下遍历字典。

>>> [i for i in {1:2, 3:4}]
[1, 3]

让我们再试一次:

>>> random.seed(42)  # for reproducability
>>> random.choice({1:2, 3:4})
KeyError: 0

很奇怪,不是吗? 0 既不在值中也不在键中。从哪里来的?

让我们看看random.choice是如何实现的。在 IPython 中,我可以这样获取它的源代码:

In [1]: import random

In [2]: random.choice??

要获取系统上的代码,您还可以查看您收到的错误消息中提到的文件:C:\Users\Python\Python37-32\lib\random.py 周围第 262 行。

在 Python 3.6.6(我系统上的版本)上,源代码是:

    def choice(self, seq):
"""Choose a random element from a non-empty sequence."""
try:
i = self._randbelow(len(seq))
except ValueError:
raise IndexError('Cannot choose from an empty sequence') from None
return seq[i]

私有(private)方法random._randbelow有说明

Return a random int in the range [0,n). Raises ValueError if n==0.

虽然这对序列(如列表、集合或元组)很有效,但我想你会明白为什么当 seq 恰好是字典(或任何其他映射):

需要

序列的长度(len(seq))

(这也适用于字典)然后

生成一个介于 0(含)和该长度(不含)之间的随机整数(这就是 self._randbelow 所做的)

所以这将是

序列中随机元素的 0 索引位置

然后是

使用该随机整数索引序列 (seq[i]) 并返回该值 (return)

这对字典不起作用,因为它们是

由他们的键索引。

这也是为什么我们有时没有得到错误,而是 random.choice 返回了一个字典值:当整数打算作为

随机位置

也恰好是字典的键之一,它会返回相应的值。如果它恰好不是我们的任何键(顺便说一句,如果所有键都是非整数,例如字符串,情况总是如此),则会发生 KeyError

关于python - 一副纸牌的随机迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53457064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com