尝试从字典中的值设置变量

2024-06-16 10:39:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在学习python,正在创建一个石头布剪刀游戏。你知道吗

我被困在一个地方。你知道吗

我现在有4个变量(尽管我想把它降到2)

  • pKey公司
  • P选择
  • 通信键
  • comChoice公司

他们分别在字典中查找关键字和值。你知道吗

choice = {1:'rock',  2:'paper',  3:'scissors'}

我遇到的问题是使用变量从字典中获取密钥。你知道吗

这是给我带来麻烦的代码片段

    print('--- 1 = Rock    2 = Paper     3 = Scissors --- ')
    pKey = input() # this is sets the key to the dictionary called choice
    while turn == 1: # this is the loop to make sure the player makes a valid choice
        if pKey == 1 or 2 or 3:
            pChoice = choice.values(pKey)  # this calls the value from choice dict and pKey variable
            break
        else:
            print('Please only user the numbers 1, 2 or 3 to choose')

    comKey = random.randint(1, 3)  # this sets the computer choices
    comChoice = choice.values(comKey)

特别是麻烦的部分是

 pChoice = choice.values(pKey)

以及

 comChoice = choice.values(comKey)

我尝试了我所知道的一切,从使用括号,尝试不同的方法,使用不同的格式。你知道吗

我很想学这个!谢谢!你知道吗


Tags: ortheto字典issets公司this
2条回答

听起来你只是想查字典

pKey = 1
pChoice = choices[pKey]  # rock

dict.values用于创建包含字典所有值的列表(实际上是一个dict_values对象)。它不用作查找。你知道吗


就您的代码结构而言,它可能需要一些工作。石头/布/剪刀的选择对于一个Enum来说是完美的,但这可能是你现在有点无法理解的。让我们试着作为顶级模块常量。你知道吗

ROCK = "rock"
PAPER = "paper"
SCISSORS = "scissors"

def get_choice():
    """get_choice asks the user to choose rock, paper, or scissors and
    returns their selection (or None if the input is wrong).
    """
    selection = input("1. Rock\n2. Paper\n3. Scissors\n>> ")
    return {"1": ROCK, "2": PAPER, "3": SCISSORS}.get(selection)

将它们作为常量进行寻址可以确保它们在代码中的任何地方都是相同的,否则会出现非常明显的NameError(而不是因为执行了if comChoice == "scisors"而导致if分支未执行)


枚举的最小示例如下所示:

from enum import Enum

Choices = Enum("Choices", "rock paper scissors")

def get_choice():
    selection = input(...)  # as above
    try:
        return Choices(int(selection))
    except ValueError:
        # user entered the wrong value
        return None

您可以通过使用更详细的枚举定义来扩展这一点,并教每个Choice实例如何计算赢家:

class Choices(Enum):
    rock = ("paper", "scissors")
    paper = ("scissors", "rock")
    scissors = ("rock", "paper")

    def __init__(self, loses, beats):
        self._loses = loses
        self._beats = beats

    @property
    def loses(self):
        return self.__class__[self._loses]

    @property
    def beats(self):
        return self.__class__[self._beats]

    def wins_against(self, other):
        return {self: 0, self.beats: 1, self.loses: -1}[other]

s, p, r = Choices["scissors"], Choices["paper"], Choices["rock"]
s.wins_against(p)  # 1
s.wins_against(s)  # 0
s.wins_against(r)  # -1

不幸的是,没有什么好的方法可以在这方面失去抽象性(抽象出“纸”到选择.纸张每次调用它)因为你不知道当Choices.rock被实例化时Choices["paper"]是什么。你知道吗

你不知道如何从dict中提取元素,你的代码应该是这样的:

import random
choice = {1: 'rock',  2: 'paper',  3: 'scissors'}

print('1 = Rock\t2 = Paper\t3 = Scissors')
pKey = int(input())
if pKey in (1, 2, 3):
    pChoice = choice[pKey]
else:
    print('Please only user the numbers 1, 2 or 3 to choose')
    pChoice = 'No choice'

comKey = random.randint(1, 3)
comChoice = choice[comKey]
print(pChoice, comChoice)

对我来说很好。你知道吗

相关问题 更多 >