字典 - 打印结果多次?

时间:2017-11-20 18:26:53

标签: python dictionary

我编写了这个程序,但运行它并键入" 2"当我输入一个主题时,它不会打印一次但只有九次。问题出在哪儿? 9是名为mat的列表中的主题数,因此它是严格连接的。现在检查一些文件.txt作为占位符,但我也想使用模块json

import os

def spat():
    a=len(list(os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/'+y)))
    print(a)
    b=100/(25-a)
    print(b)

mat=["latino","greco","storia","latino","scienze","matematica","grammatica",
     "promessi sposi,","eneide"] #mat means subject

c=input("Do you want to add a placeholder or calculate probabilties? 1|2: ")
if c == "1":
    c=input("Insert a subject: ")
    c=c.lower
    if c in mat:
        name=input("Insert the name of the student: ")
        open('C:/Users/SUINO/Desktop/python/prob/cache/'+c+'/'+name+".txt")
    else:
        print("Materia non esistente!")
if c == "2":
    y=input("Materia: ")
    y=y.lower()
    x={"latino":spat(),"greco":spat(),"eneide":spat(),"promessi sposi":spat(),
       "mate":spat(),"grammatica":spat(),"storia":spat(),"scienze":spat(),
       "inglese":spat(),}

该计划的目标是使用文件.txt来计算被询问的概率,该文件的名称已经被询问的学生的姓名。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你基本上是在尝试创建一个CLI来访问家庭作业或学生可以与之交互并访问其文件的其他学校作业。

我刚刚注意到您还尝试访问函数y中的var spat()。您需要将此值传递给函数调用。如果要将每个键映射到函数。

如果你想让关键字作为参考,你需要像这样构建你的字典:

x = {
    'latino': spat,
    'greco': spat,
    ...
}

然后,当用户输入值时,您只需将新变量声明为键的值,然后创建一个变量,该变量是对该函数的引用。

因此,如果您收到带有

的输入y
y = input("Materia: ")

然后你应该创建一个像这样的新变量

func = x[y]

这将找到从上面的输入函数输入的键值,并将该引用赋值给变量func。从本质上讲,func现在等于函数,你可以像任何其他正常函数一样执行func以及传入变量。

func(y)

这将执行引用的函数(spat)并传入变量y。您还需要重写spat()

def spat(y):
    a = len(list(os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/'+y)))
    print(a)
    b = 100/(25-a)
    print(b)

基本上相同,除了你现在从下面的输入传入y

您还需要将字典的声明移到顶部,以便在声明func时识别您对此字典的引用。

所以整个代码:

import os

def spat(y):
    a = len(list(os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/'+y)))
    print(a)
    b=100/(25-a)
    print(b)
x = {"latino":spat,"greco":spat,"eneide":spat,"promessi sposi":spat,
   "mate":spat,"grammatica":spat,"storia":spat,"scienze":spat,
   "inglese":spat,} # x moved up from bottom
mat = ["latino","greco","storia","latino","scienze","matematica","grammatica",
     "promessi sposi,","eneide"] #mat means subject

c = input("Do you want to add a placeholder or calculate probabilties? 1|2: ")
if c == "1":
    c = input("Insert a subject: ")
    c = c.lower
    if c in mat:
        name = input("Insert the name of the student: ")
        open('C:/Users/SUINO/Desktop/python/prob/cache/'+c+'/'+name+".txt")
    else:
        print("Materia non esistente!")
if c == "2":
    y=input("Materia: ")
    y=y.lower()
    func = x[y] # creates reference to the key which is a ref to a function
    func(y)

但是,由于每个键值都在执行相同的功能,因此您最好不要为每个新键编写新的词典条目,只需简单地列出学生可以输入的已识别主题:

subjects = ['latino', 'greco', 'grammatica', ...]

然后,您只需检查输入是否存在于此列表中,如果存在,则运行spat()并传入y

if y in subjects:
    spat(y)
else:
    print("Unrecognized command...")

字典中的映射函数对于创建“接口”非常有用,该接口可以将各种输入路由到将为该给定选项执行的函数。您可以通过简单地检查列表/字典中的输入来检查它们的命令是否有效,如果它不存在,那么您可以跳过运行该函数并输出错误消息 - 如果该命令存在,那么您可以将它引用到一个键值(然后将其引用到该键的值),然后它将运行正确的函数。

答案 1 :(得分:0)

简短的回答是它打印了9次,因为您在声明中对spat()进行了所有调用:

x={"latino":spat(),"greco":spat(),"eneide":spat(),"promessi sposi":spat(),
   "mate":spat(),"grammatica":spat(),"storia":spat(),"scienze":spat(),
   "inglese":spat(),}

您的代码还存在许多其他问题,但由于我并不完全了解它所要完成的所有事情,因此我不打算告诉您该做什么,而不是多次调用它那样的。