测试字典键是否以字母结尾?

时间:2018-07-06 18:59:17

标签: python python-3.x dictionary

tools = {"Wooden_Sword1" : 10, "Bronze_Helmet1 : 20}

我已经编写了添加项目的代码,我正在添加项目,如下所示:

tools[key_to_find] = int(b)

key_to_find是工具,b是耐用性,我需要找到一种方法,因此,如果我要添加并且Wooden_Sword1已经存在,它将添加一个{{1} }。这也必须与其他物品一起使用

4 个答案:

答案 0 :(得分:2)

正如user3483203ShadowRanger所评论的那样,在密钥字符串中使用数字作为数据的一部分可能是个坏主意。操纵这些数字将很尴尬,还有更好的选择。例如,使用简单的键并存储列表,而不是为每个编号的键存储单个值。列表中的索引将替换键中的数字。

这是实现它的方法:

tools = {"Wooden_Sword" : [10], "Bronze_Helmet" : [20]}

添加耐用性为10的新木剑:

tools.setdefault("Wooden_Sword", []).append(10)

查找我们拥有多少个青铜头盔:

helmets = tools.get("Bronze_Helmet", [])
print("we have {} helmets".format(len(helmets)))

找到第一个具有非零耐用性的青铜头盔,并将其减少1:

helmets = tools.get("Bronze_Helmet", [])
for i, durability in helmets:
    if durability > 0:
         helmets[i] -= 1
         break
else: # this runs if the break statement was never reached and the loop ran to completion
    take_extra_damage() # or whatever

您可以通过使用collections.defaultdict而不是常规词典来简化其中一些代码,但是如果您学习如何使用getsetdefault,那么使用它并不难常规的dict

答案 1 :(得分:0)

据我对问题的了解,您的密钥分为2个部分:“名称”和“ ID”。 ID只是一个以1开头的整数,因此您可以为每个名称初始化一个计数器:

Option Explicit

Private Sub CommandButton1_Click()
    Static pwd As String

try_again:
    If pwd <> "thePassword" Then
        'password challenge
        pwd = InputBox(Prompt:="Please enter the password to unlock the updater." & vbLf & "(Case Sensitive)", _
                       Title:="Control Panel")

        'check if the password challenge was cancelled
        If pwd = vbNullString Then Exit Sub

        'compare again
        GoTo try_again
    End If

    'all the good code once the password challenge has been passed
    Debug.Print "pass"

End Sub

并添加到数组中:

numOfWoodenSwords = 0

如果您需要未知数量的工具,建议您查看re模块:https://docs.python.org/3/library/re.html

或者您可以遍历numOfWoodenSwords += 1 tools["wodden_sword" + str(numOfWoodenSwords)] = int(b) 来查看条目是否存在。

答案 2 :(得分:0)

要确保密钥名称尚未被使用,并添加一个数字(如果已输入),请创建新名称并进行测试。如果已经在列表中,则增加该数字。重复一遍,直到找不到为止。

在代码中:

anydpi-v26

尽管此代码可以完成您所要求的操作,但您可能需要查看其他方法。可能的缺点是def next_name(basename, lookup): if basename not in lookup: return basename number = 1 while basename+str(number) in lookup: number += 1 return basename+str(number) WoodenShoe1之间没有关联 –如果“所有木鞋”都需要提高价格,则必须反复进行WoodenShoe551之间的所有可能名称,以防万一这些名称有时存在。

答案 3 :(得分:0)

您可以编写一个确定字符是否为字母的函数:

def is_letter(char):
    return 65 <= ord(char) <= 90 or 97 <= ord(char) <= 122

然后,当您查看字典中的键时,只需:

if is_letter(key[-1]):
    ...