我编了一本字典,你可以在下面看到,
dic1={'T1':{'ID':101,'Salary':20000,'ML':15,'DL':10,'CL':12,'P1':'8th','P2':'9th','P3':'10th','FP':4},
'T2':{'ID':102,'Salary':15000,'ML':15,'DL':10,'CL':12,'P4':'10th','P5':'7th','P6':'12th','FP':2},
'T3':{'ID':103,'Salary':15000,'ML':15,'DL':10,'CL':12,'P7':'5th','P8':'10th','P2':'12th','FP':1},
'T4':{'ID':104,'Salary':15000,'ML':15,'DL':10,'CL':12,'P4':'4th','P6':'9th','P1':'10th','FP':3}}
这里,我想获取哪个教师缺席的用户输入,然后应用一个循环,该循环查看存储在缺席教师的详细信息中的时段(P1、P2等),然后打印在其空闲时段中具有缺席教师的时段的密钥(另一教师(T1、T2等))。
**供参考:**假设T1老师缺席,其课时分别为1、2、3(P1、P2、P3)。此时循环打印其空闲课时(FP)分别为1、2、3的老师(即T2、T3、T4)
我试过使用不同的循环(下面给出了一个),但是没有得到我之前告诉你的我想要的输出。所以,请告诉我,如果有人有任何解决方案,或者我必须改变字典中的任何东西,这可能会帮助我得到所需的输出。
a=input("Enter Teacher name")
k={key: val for key,val in dic1[a].items() if key.startswith('P')}
for i in dic1:
for j in dic1[i].items():
if j==k:
print(i)
print(k)
print(j)
print(i)
print(k)
print(j)
2条答案
按热度按时间whlutmcx1#
好问题!我将分两部分回答,第一部分将解释为什么你的示例循环不工作,第二部分将提供一个工作的解决方案(尽管它可能不是特别好的优化)。
第一部分
看看这个例子,当你运行循环时,
j
将是一个包含键的元组,每个教师数据的值对。当您创建k
时,它是一个字典。如果您在if j==k:
之前添加print语句,您将看到j
和k
是什么。下面是前几个j
和k
的示例第一位老师的答案是:如您所见,即使
j = ('FP', 4)
是元组。当您通过写入if j == k:
来测试是否相等时,由于j
是元组而k
是dict,因此会失败。在相等测试期间会比较对象类型,因此这将失败。注意:相等性测试非常严格,因此j和k必须完全相等(类型和内容)才能返回真。第二部分
下面的代码应该可以解决你的问题。我已经添加了注解来逐行解释它。
有几点需要注意。
1.首先,我们创建一个名为
target_periods
的教师缺席时段列表。您会注意到,我用“”替换了“P”,然后将结果转换为整数。这确保时段编号的格式与我们稍后比较的FP值相同。1.接下来,当我们开始遍历教师时,我们需要跳过缺席的教师。
1.最后,当我们遍历剩下的教师时,我们只对他们的FP感兴趣,所以我们可以通过它的键直接访问它,并检查它是否在我们的目标时段列表中。
如果你需要任何进一步的澄清请告诉我。
91zkwejq2#
你的字典其实没什么毛病--它可以照原样使用。
你首先需要检查指定的教师(输入)是否在字典中,如果是,那么分离出Pn键(它们的值是不相关的),将Pn键的数字部分添加到集合中。
现在遍历主字典。忽略输入的教师。获取FP值并检查它是否在先前构造的集合中。
相应输出: