获取用户输入并循环许多变量,以便将该输入与其中一个变量匹配

2024-06-01 09:52:30 发布

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

我在一个学校项目中创建了一个岛屿的ASCII地图。有140多个变量用于打印岛上的地名

我不只是将名称放在文本中,因为我试图找到一种方法来获取用户输入并将该输入与变量匹配。然后将ASCII颜色代码及其原始字符串指定给该变量,以便在打印地图时显示与其他颜色不同的颜色

比如说:

map = x + """ ------------- """ + y 
x = "x"
y = "y"
red = "\033[31m" #color code

place = input("Where do you want to go?: ")

如果用户输入“x”,则“x”应显示为红色

我使用了"""而不是",因为我的实际地图由更多的线组成,我想指出,如果它有区别的话

我知道我可以用{}和{}来实现这一点。但这将导致大量代码行,因为我要处理更多的变量

所以我想知道是否有一种方法可以循环使用这些变量,每次都能找到正确的变量

我认为字典是最好的选择,因为这是人们在我上一篇文章中建议的,但我不确定如何在实际的python代码中实现它

老师提到,我们不应该使用索引来跳过可变部分,而只是将颜色代码放在地图本身的正确单词之前


Tags: 项目方法字符串代码用户文本名称map
3条回答

如果我理解正确,您可能在过去使用列表变量尝试过使用for循环

幸运的是词典的作用与列表几乎相同,只是它们不使用index:value引用(即list[index]=value)。他们使用key:value配对(dict[key]=value)

该语法使用大括号,如下所示: 字典{“key1”:value1,“key2”:value2

这为您提供了一种快速简便的方法来引用值,而无需循环加载项。不幸的是,听起来你得自己编字典了

读者注意:OP的指导老师对他们施加了人为的限制。这里演示的机制不是我建议在生产代码中使用的机制。有更好的方法可以获得类似的功能,即使用公共Python数据结构而不是单个全局变量。这种方法的一大缺点,除了它是一个黑客,是即使设置变量值可以简单地通过一个输入的名称,您将不得不改变代码添加新的“地方”。在生产代码中,地图和地图上的各个位置应作为输入数据输入到代码中。当地图或地点列表更改时,代码不必更改

知道你想要什么,我看了一眼,立刻发现确实有一种方法可以设置给定名称的全局变量的值。这种机制就是globals()调用。此调用返回一个字典,其中包含对所有全局变量的引用。键是变量名,值与变量的实际值相关联

以下是给出问题代码的最基本示例:

x = "x"
y = "y"
red = "\033[31m"  # color code

place = input("Where do you want to go?: ")

g = globals()
g[place] = red + g[place]

print("x =", x)
print("y =", y)

测试运行1:

enter image description here

测试运行2:

enter image description here

请注意,添加的颜色代码会使输出从打印该变量值的点变为红色,直到输入结束

下面是一个更完整的示例,它同时使用颜色代码和“结束颜色”代码,因此只有变量的打印值是红色的。在本例中,您可以继续输入w、x、y或z中的1个,然后只需按Return键即可退出:

w = "w"
x = "x"
y = "y"
z = "z"

red = "\033[31m"  # color code
end="\033[0m" # cancel color code

g = globals()

while True:
    print("w =", w)
    print("x =", x)
    print("y =", y)
    print("z =", z)

    map = x + """       - """ + y
    print("map =", map)

    place = input("Where do you want to go?: ")
    if not place:
        break
    g[place] = red + g[place] + end

试运行:

enter image description here

请注意,您输入的每个变量名称都会导致该变量的值更改为显示为红色。发生这种情况是因为修改了实际全局变量的值,然后直接打印该变量的值。这是您要求的关键功能

注意:我不建议您在生产代码中使用这种机制。有更好的方法来做这些事情,即使用字典或列表。这种方法的一个缺点是,即使可以简单地设置变量值,您仍然必须更改代码以添加“位置”。在生产代码中,地图和地图上的各个位置应作为输入数据输入到代码中。当地图或地点列表更改时,代码不必更改

我希望这能满足你的需要。快乐编程

我想我明白了。所以我使用了上面提到的字典。我找到了包含与usr_输入匹配的字符串的变量,我将其值存储在另一个变量中,我们称之为“random”。我从字典中删除匹配变量,然后向字典中添加一个名称相同但值正确的新变量。所以代码看起来是这样的:

var1 = "one"
var2 = "two"
red="\033[31m"

dict = {var1: "one", var2:"two"}
print(dict)

输出:

{var1: "one", var2:"two"}

现在我们编辑这条格言:

place = input("Enter: ")
#this is just the usr_input. Its here only so no one asks what does the variable "place" contain.

for k,v in list(dict.items()):
    if v == place:
        random = red + v #random now has the correct value we want
        new_key = f'{k}' #this gets the name of the variable which matches the usr_input
        del dict[k] #deletes the matching variable
        dict[new_key] = random 
# adds a new variable with the same name as the matching one and the correct value 
# we got from random
print(dict)

输出:

{var1: "one", var2:"\033[31mtwo"}

现在是我现在不知道的部分,如果它满足限制条件。我不再将变量用作:

map = "   " + var1 + "   -" 

我从字典中获取值:

map = "  -" + dict[var2] + "  -"

这将提供正确的输出。所以我不会放弃或改变这一切。我会让它这样,祈祷它没有任何问题。这完全是一种非正统的做事方式,但最终我学到了一些我一无所知的字典知识。我得到的唯一问题(可能会在课堂上问)是: 我真的不明白list()做什么?我只知道如果没有它,我会出现运行时错误

除此之外,谢谢你们所有人的回答,并为我指明了正确的方向。我知道我的术语是如此错误,因为我谈论了很多我还没有完全理解的事情。(特别是我说的值、变量、键等部分)我真的认为我把它们搞砸了!希望我没有给你带来太多的背部疼痛:)

相关问题 更多 >