导致输入结果改变的字典顺序?

时间:2016-01-17 18:31:05

标签: python python-3.x dictionary input

这里是新的,也是Python的新手。放轻松我。 我有一个.bat,允许用户输入IP或主机名,如果有效则会ping目标,然后允许执行某些操作。但是,它相当不灵活,我认为我已经达到了用这种方法做的极限。 我决定在python中创建相同的脚本以允许更灵活的方法,其中可以通过词典定义多个标准,而不是让用户逐个输入它们,这有望避免用户错误/拼写错误。

我已经完成了代码的第一步,即要求用户输入一个关键字,然后根据其中一个词典进行检查,如果正确设置了一些标准并允许用户继续输入他们的IP。

我的问题是: 1。 根据字典打印的顺序,将取决于接受哪​​些关键字。 例如,如果字典按顺序打印;

{'TestGame': ['test', 'testing', 'tst'], 'ZestGame': ['zest', 'zesting', 'zst']}

然后脚本只接受单词test,testing或tst。 如果' Zestgame'首先打印。

和2。 如果用户输入了不允许的单词,则应显示消息

The project or game you entered was not recognised.

然后循环以要求他们输入有效的关键字。但是它会跳过上述消息,immediatley要求用户

Enter your PROJECT or GAME

这些想法或解决方案?

完整代码:

import os, sys, ipaddress

# Allowed Project names with related keywords.
Projects = {
    "ZestGame":     ['zest', 'zesting', 'zst'],
    "TestGame":     ["test", "testing", "tst"]}
print(Projects)
# Email format tied to Project
ProjectEmails = {
    "ZestGame":     "zsti-zesty",
    "TestGame":     "tsti-testy"}
# Unique 32 character ID.
ProjectSCIDs = {
"ZestGame":     "246zesty810scid12141618202224262",
"TestGame":     "123testy456scid78910111213141516"}
# Step 1 Start - Set ActiveProject and associated information.
InputResult = "NOTFOUND"
while True:
    if InputResult == "Valid":
        break
    ActiveProject = "NOTFOUND"
    ActiveProject = "NOTFOUND"
    ActiveSCID = "NOTFOUND"
    UserInput = input("Enter your PROJECT or GAME:\n")
# Checks UserInput against Projects dictionary, loops if invalid.
for key, val in Projects.items():
    if UserInput.lower() in val:
        ActiveProject = key
# Sets ActiveProject, ActiveEmail and ActiveSCID if UserInput input result was OK.
    for key, val in ProjectEmails.items():
        if ActiveProject in key:
            ActiveEmail = (val+"@email.com")
    for key, val in ProjectSCIDs.items():
        if ActiveProject in key:
            ActiveSCID = val
            InputResult = "Valid"
        break
    else:
        print("The project or game you entered was not recognised.")
        InputResult = "NOTFOUND"
print("\nThe user selected "+ActiveProject)
print(ActiveEmail+" "+ActiveSCID)

1 个答案:

答案 0 :(得分:2)

请注意,Python dics未订购,更改代码并使用OrdererDict使用广告订单

让我举一个例子:

>>> d = {k:v for k,v in zip("asdfghjkl", range(10))}
>>> d
{'a': 0, 'd': 2, 'g': 4, 'f': 3, 'h': 5, 'k': 7, 'j': 6, 'l': 8, 's': 1}

>>> od = OrderedDict(zip("asdfghjkl", range(10)))
>>> od
OrderedDict([('a', 0), ('s', 1), ('d', 2), ('f', 3), ('g', 4), ('h', 5), ('j', 6), ('k', 7), ('l', 8)])

注意第一个词典中的's'键是如何位于"最后位置"它,但在有序的词典中,它处于"第二个位置"因为它应该插入。

要检查用户输入是否在任何词典中,只需在该词典中使用.has_key(ActiveProject)方法

示例:

检查1 dict:

if not Projects.has_key(ActiveProject):
    print "The project or game you entered was not recognised."

检查所有dicts:

if not any(map(lambda x: x.has_key(ActiveProject), [Projects, ProjectEmails])):
    print "The project or game you entered was not recognised."
else:
    do whatever