Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典-多次打印结果?_Python_Dictionary - Fatal编程技术网

Python 字典-多次打印结果?

Python 字典-多次打印结果?,python,dictionary,Python,Dictionary,我正在编写这个程序,但运行它并键入“2”,当我键入一个主题时,结果不会打印一次,而是打印九次。问题在哪里?9是名为mat的列表中的主题数,因此它是严格连接的。现在检查一些files.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

我正在编写这个程序,但运行它并键入“2”,当我键入一个主题时,结果不会打印一次,而是打印九次。问题在哪里?9是名为
mat
的列表中的主题数,因此它是严格连接的。现在检查一些files.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文件计算被询问的概率。

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

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

如果您希望密钥作为引用,则需要将dict的结构如下:

x = {
    'latino': spat,
    'greco': spat,
    ...
}
然后,当用户输入一个值时,您只需声明一个新变量作为键的值,而键的值又创建了一个引用该函数的变量

因此,如果您使用

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...")

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

简短的回答是,它打印了九次,因为您在语句中输入了所有对
spat()的调用:

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

您的代码还存在许多其他问题,但由于我不完全理解它试图实现的所有功能,我不会尝试告诉您除了多次不这样调用它之外该做什么。

请修复缩进。您的最后一行调用了
spat()
9次,每一次都会打印两个东西。顺便说一句,代码中有几个大错误。例如,
c=c.lower
c
设置为等于绑定方法
.lower
。它将永远不会在
垫中
。您希望实际调用该方法:
c.lower()
。另外,为什么您使用
open('C:/…')
但从不分配任何内容?这句话完全没用。@glibdud是的。而且,
spat
实际上并不返回任何内容,因此它将隐式返回
None
,而不是计算值,它只是
print
ed
c=c。lower
c
指定一个绑定方法。要实际调用该方法,需要使用
c=c.lower()