来自与Python中的用户输入名相同的元组的值(我很难解释,如果我能找到更好的方式来表达自己,将更新标题)

来自与Python中的用户输入名相同的元组的值(我很难解释,如果我能找到更好的方式来表达自己,将更新标题),python,Python,我是一个非常初级的学习者,我正在参加Python课程学习。这个问题与课堂无关,只是我在课堂上做的一个项目(我在做一个简单的游戏,使用课堂上学到的概念来更新、扩展和清理代码) 我现在正在学习元组、列表和字典,并认为简单的元组可以清除很多IF语句并简化代码。然而,我无法让它完全按照我希望的方式工作 基本上,我的所有类都有一组元组(注意,这些是训练分类,而不是Python类)。它们有不同的数字,然后我有一个元组,其中包含所有类的名称列表。在代码中的某个时刻,我请求用户输入以确定角色的类别。我希望能够使

我是一个非常初级的学习者,我正在参加Python课程学习。这个问题与课堂无关,只是我在课堂上做的一个项目(我在做一个简单的游戏,使用课堂上学到的概念来更新、扩展和清理代码)

我现在正在学习元组、列表和字典,并认为简单的元组可以清除很多IF语句并简化代码。然而,我无法让它完全按照我希望的方式工作

基本上,我的所有类都有一组元组(注意,这些是训练分类,而不是Python类)。它们有不同的数字,然后我有一个元组,其中包含所有类的名称列表。在代码中的某个时刻,我请求用户输入以确定角色的类别。我希望能够使用该输入,以便从元组中提取(正确的术语是拼接吗?)值,比如说,我希望将元组第三个位置的任何值添加到另一个值。现在我无法将用户输入与同名的元组相关联。有办法做到这一点吗



你应该使用dict

my_class = dict(
Apprentice=(6, 0, 0, 0, 0, 0, 0),
Warrior=(12, 2, 0, 2, 0, 0, 0),
Paladin=(14, 2, 0, 2, 1, 0, 1),
Barbarian=(12, 6, 0, 3, -1, -1, -1),
Blademaster=(10, 4, 4, 0, 0, 0, 0),
Assassin=(8, 0, 8, -2, 0, 0, 0),
Rogue=(8, 0, 4, 0, 0, 0, 0),
Monk=(10, 2, 2, 2, 2, 2, -4),
Bard=(8, 0, 0, 0, 0, 0, 4),
Mage=(6, 0, 0, 0, 2, 2, 0),
Priest=(6, 0, 0, 0, 1, 2, 1),
Wizard=(4, -2, -2, -2, 6, 8, 0),
Scholar=(6, -1, -1, 0, 4, 4, 0),
Necromancer=(6, 0, 0, 0, 6, 6, -5),
)
while 1:
    try:
        val = my_class[raw_input('What type of training have you had (Class)? ')]
        break
    except KeyError:
        print 'That is not a valid class.'

您可以通过访问全局变量列表来实现这一点,但是我建议不要这样做。更好的方法是创建一个类字典,如下所示:

classes = {'Apprentice':Apprentice,'Warrior':Warrior, ...}
然后做一些类似的事情

selected_class = None

while True:
    charClass = raw_input('What type of training have you had (Class)? ')
    if charClass in classes:
        selected_class = classes[charClass]
        break
    else:
        print 'That is not a valid class.'

最好使用字典,但如果是作业,不允许使用字典,则可以执行以下操作:

validClass = False
while validClass == False:
    charClass = raw_input('What type of training have you had (Class)? ')
    if charClass in classList:
        print eval(charClass)
        validClass = True
    else:
        print 'That is not a valid class.'

eval
函数允许您在其内部运行python代码。同样,最好使用字典。

最好使用字典,但如果不允许这样做,可以使用
vars()
函数,该函数返回所有全局值的字典

while validClass == False:
    try:
        vals = vars()[raw_input('What type of training have you had (Class)? ')]
    except KeyError:
        print 'That is not a valid class.'

尝试将每个变量与字符名称字符串一起存储在字典中,而不是创建单独的元组。现在不可能将ClassList与stats链接,因为每个类的变量名不能与每个类的字符串名进行比较(您必须将一个字符串与另一个字符串进行比较)

如果你以前没有使用过词典,那就试试学习吧。我认为这在这种情况下会非常有帮助


我没有得到你想要的东西…你想打印
Necromancer=(6,0,0,6,6,-5)
if
charClass=“Necromancer”
的值吗?例如,我想你刚刚独立地重新发现了字典如此方便的原因。^)基本上,如果有人在提示输入charClass时输入“Warrior”,我希望能够访问Warrior元组中的值。这样我就可以在以后的代码中添加这些值。void-是的,对于基础知识来说,打印这些值是一个开始,将它们添加到代码中的其他值是最终目标。DSM-很抱歉,我还没有进入字典部分,因为我的互联网基本上已经用得太多了,在助教提供低带宽版本之前,我无法观看讲座视频。正常的视频是70-90MB的5分钟视频,而低带宽的视频是70-90MB的十分之一,虽然清晰度不是很高。太好了,我差点忘了dict()的关键字参数输入。谢谢你,先生,你已经帮到我了。在{}上使用dict()有什么原因吗?它们可以在每一个Python中使用吗?一个比另一个更“可接受”吗?我的朋友,Muchos gracias!非常感谢!正如另一个答案中所描述的那样,我最终选择了一本字典,但我也非常感谢你的解决方案,这不是一项作业,只是我在整个学期中一直在玩的一件小事(我从第一周开始就有了我的原始代码,在学期结束时,我想回去看看我的新代码有多高效,我能用它做多少。)我感谢您的时间,并祝您有一个幸福的一天。Velox,您给了我我需要的答案,我需要一个新的变量和一种将其设置为dictionary name的方法,其中splice是输入变量的值,如果它比我说的更有意义的话;)非常感谢您的帮助。
validClass = False
while validClass == False:
    charClass = raw_input('What type of training have you had (Class)? ')
    if charClass in classList:
        print eval(charClass)
        validClass = True
    else:
        print 'That is not a valid class.'
while validClass == False:
    try:
        vals = vars()[raw_input('What type of training have you had (Class)? ')]
    except KeyError:
        print 'That is not a valid class.'