【问题标题】:Python 2 : Cannot understand why this evaluates to a String instead of the List ValuePython 2:无法理解为什么这会评估为字符串而不是列表值
【发布时间】:2015-08-24 02:58:22
【问题描述】:

这里的初学者词典问题。我有这个代码:

import random

abilities = {
'Spell': '''fireball missile dread curse fear teleport shield 
cure heal blast reveal fade taunt reveal haste shock'''.split(),
'Weapon': '''axe sword mace club longbow shortbow crossbow greatsword 
greataxe dagger shortsword longsword staff claw'''.split(),
'Skill': '''jump slash parry dodge block smash grab jab evade stab 
crush charm lure lift throw grapple punch'''.split(),
'Monster': '''goblin troll ogre ninja pirate knight warlock witch 
mage lich ooze gargoyle bandit thief wizard swordmaster'''.split()}

def getAbility(abilityDict):
    #get ability key
    abilityKey = random.choice(list(abilityDict.keys()))
    #get random value from ability key
    abilityValue = random.randint(0, len(abilityDict[abilityKey]) -1)
    return [abilityDict[abilityKey][abilityValue], abilityKey]

ability, abilityKey = getAbility(abilities)

print abilityKey, ability

当我调用 print 函数时,它会评估为像“Monster ooze”或“Weapon Sword”这样的字符串

但是,当我在函数中更改这一行时:

return [abilityDict[abilityKey][abilityValue], abilityKey]

到这里:

return [abilityDict[abilityKey][abilityValue]]

并改变这个:

ability, abilityKey = getAbility(abilities)
print abilityKey, ability

到这里:

ability = getAbility(abilities)
print ability

然后 print 函数从列表格式的随机键中计算出一个随机值,因此 ['bandit'] 或 ['axe']

我的问题是: 为什么 return [abilityDict[abilityKey][abilityValue],abilityKey] 返回一个字符串,而 return [abilityDict[abilityKey][abilityValue]] 返回一个列表?

我只需要知道为什么,因为仅仅记住它并不能真正帮助我掌握 Python 字典的概念。

感谢您提供的任何帮助。

【问题讨论】:

    标签: python-2.7


    【解决方案1】:

    为什么 return [abilityDict[abilityKey][abilityValue],abilityKey] 返回一个字符串,而 return [abilityDict[abilityKey][abilityValue]] 返回一个列表?

    它没有。他们都返回列表。在第一种情况下,您将返回一个包含两个字符串的列表:

    >>> getAbility(abilities)
    ['slash', 'Skill']
    

    然后你将这个列表解压缩成两个元素:

    >>> ability, abilityKey = getAbility(abilities)
    >>> ability
    'heal'
    >>> abilityKey
    'Spell'
    

    然后打印:

    >>> print(abilityKey, ability)
    Spell heal
    

    通常您会为此使用元组,而不是列表(即删除外部 []),但两者都可以在这里使用。

    在第二种情况下,return [abilityDict[abilityKey][abilityValue]],您返回一个包含一个字符串的列表。 (这有点奇怪——通常你只需返回字符串本身):

    >>> getAbility2(abilities)
    ['teleport']
    

    据我所知,您的困惑根本与字典无关,而是您在比较两个不同的东西,即print some_string, some_other_stringprint some_list_with_one_string

    (PS:既然你已经知道random.choice,那么你可以使用random.choice(abilityDict[abilityKey])而不是使用random.randint(0, len(abilityDict[abilityKey]) -1)通过索引。)

    【讨论】:

    • 谢谢,我想我明白了。当我删除返回外部的括号并将其转换为您所说的元组时,返回能力Dict[abilityKey][abilityValue] 从字典中返回一个随机值作为字符串。从视觉上看,这样更有意义,但是我仍然有点困惑,为什么第一种情况会返回一个包含两个字符串的列表。在我真正理解发生了什么之前,我会回到这个问题上并再玩一玩。 :D
    • 因为你告诉它! [abilityDict[abilityKey][abilityValue], abilityKey] 周围有两个括号,用于指定一个列表。 [1,2] 是两个整数的列表; ['c', (2.3,4.5)] 是一个列表,第一个元素是字符串,第二个元素是两个浮点数的元组; [abilityDict[abilityKey][abilityValue], abilityKey] 是一个列表,abilityDict[abilityKey][abilityValue](字符串)作为第一个元素,abillityKey(字符串)作为第二个元素。
    • 啊啊啊,我明白了。这实际上有很大帮助。当我拿走 ,abilityKey 时,我基本上是在告诉函数返回一个列表,因为我将 StringabilityDict[abilityKey][abilityValue] 包围在 [] 中。现在一切都说得通了,我只是以错误的方式看待它。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多