【问题标题】:Get A Random Value from dictionary in Python从 Python 中的字典中获取随机值
【发布时间】:2023-03-10 15:38:01
【问题描述】:

如何从字典中随机获取一对?我正在用二十一点做游戏,所以用户会从

中随机获得一对
deck_of_cards = {'A':11,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}

它会被存储在一个字典

player_deck = {}

我该怎么做?

【问题讨论】:

  • 记住 player_deck 需要是字典
  • player_card = [] player_card += random.choice(dict(d.items()) print player_card
  • 但它可以在列表中使用
  • 只是想指出,'A' 在黑杰克中并不总是 11... 我希望您的程序稍后会处理这个问题。此外,构建这个 dict 似乎是多余的,您可以简单地在其中执行 deck='23456789TJQKA' 选择一个随机字符并稍后处理值
  • 是的,A 的值取决于玩家@OferSadan,我认为在它大于 21 之后,我会将 A 的值替换为 1

标签: python python-2.7 random


【解决方案1】:

使用random.choice()

import random
player_deck = {}
deck_of_cards = {'A':11,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}

key, value = random.choice(list(deck_of_cards.items()))
player_deck[key] = value

或者,如果您希望将键和值直接放入字典中,您可以这样做

player_deck = dict([random.choice(list(deck_of_cards.items()))])

【讨论】:

  • 它不存储在字典中
  • @mvrht 只需将键和值添加到您的字典中
  • 只是dict([random.choice(list(deck_of_cards.items())]) 应该创建一个字典
  • @Jean-FrançoisFabre:语法错误,缺少一个 )。不过,OP 的数据结构对 Blackjack 没有任何帮助。
  • @Jean-FrançoisFabre 谢谢,我相应地更新了我的答案
【解决方案2】:

目前还不清楚你想如何用这个 dict 模拟一副套牌。

如果您只是多次使用random.choice,您可能会获得两次同一张卡,这可能不应该发生。

您可以创建一个完整的牌组(作为列表,而不是作为字典),shuffle 它,抽一张牌(从而将其从牌组中移除),然后检查其值。 使用namedtuple 定义一个新的Card 类并不太难,并且之后会更容易使用(感谢@MaartenFabré 的评论):

# encoding: utf-8
import random
from collections import namedtuple


class Card(namedtuple('Card', ['face', 'color'])):
    colors = ['♠', '♥', '♦', '♣']
    faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
    values = dict(zip(faces, [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]))

    def __repr__(self):
        return self.face + self.color

    def value(self):
        return Card.values[self.face]

    @staticmethod
    def all():
        return [Card(face, color)
                for color in Card.colors for face in Card.faces]

deck = Card.all()

print(deck)
# ['A♠', '2♠', '3♠', '4♠', '5♠', '6♠', '7♠', '8♠', '9♠', '10♠', 'J♠', 'Q♠', 'K♠', 'A♥', '2♥', '3♥', '4♥', '5♥', '6♥', '7♥', '8♥', '9♥', '10♥', 'J♥', 'Q♥', 'K♥', 'A♦', '2♦', '3♦', '4♦', '5♦', '6♦', '7♦', '8♦', '9♦', '10♦', 'J♦', 'Q♦', 'K♦', 'A♣', '2♣', '3♣', '4♣', '5♣', '6♣', '7♣', '8♣', '9♣', '10♣', 'J♣', 'Q♣', 'K♣']

random.shuffle(deck)

print(deck)
# ['9♣', '4♠', 'J♥', '9♦', '10♠', 'K♣', '8♥', '3♣', 'J♣', '10♦', '8♦', 'A♣', '7♦', '3♠', '7♠', 'Q♣', '7♥', 'Q♦', 'A♦', '9♥', '2♠', '7♣', '6♦', '4♣', 'Q♠', '3♥', 'K♠', '6♣', '5♦', '4♥', '5♣', '2♣', '2♥', '6♥', '8♠', '2♦', '4♦', '8♣', 'K♦', '10♥', 'K♥', '5♠', 'J♦', '5♥', 'A♥', '9♠', '6♠', 'Q♥', '10♣', 'A♠', '3♦', 'J♠']

a_card = deck.pop()
print(a_card)
# J♠
print(a_card.face)
# J
print(a_card.color)
# ♠
print(a_card.value())
# 10

【讨论】:

  • 'dict' 对象不可调用
  • 在线values = dict(zip(faces, [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]))
  • @mvrht:是的,我使用的数据类型与您的问题不同。在我看来,套牌不应该是dict
  • 应该是什么?
  • 我会使用deck = list(itertools.product(colors, faces)) 而不是deck = list(itertools.product(colors, faces)) 来获取元组列表。您如何表示它们“x of y”或其他方式可以在另一个级别上完成,但这样您以后可以更轻松地检查颜色或面部。一个单独的类(或namedTuple)甚至可能更容易
【解决方案3】:

使用random.choice

import random
player_deck = {}
deck_of_cards = {'A':11,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}
d = random.choice(list(deck_of_cards.items()))
player_deck.update(d)
print(player_deck)
{'9': 9}

【讨论】:

  • 字典更新序列元素#0的长度为1; 2 是必需的
【解决方案4】:

你可以这样做:

import random

deck_of_cards = {'A':11,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}
player_deck = dict(random.sample(deck_of_cards.items(),1))

我基本上是从字典中请求“1”个随机样本并将输出类型转换为字典(因为它返回一个列表)。

【讨论】:

    【解决方案5】:

    你可以使用random.choice:

    import random
    player_deck=[]
    player_deck.append(random.choice(list(deck_of_cards.items())))
    print(player_deck)
    

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 2015-01-09
      • 2020-01-26
      相关资源
      最近更新 更多