python 如果一个值匹配,我如何打印字典的键?

bfnvny8b  于 2023-01-12  发布在  Python
关注(0)|答案(2)|浏览(136)

我编了一本字典,你可以在下面看到,

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)
whlutmcx

whlutmcx1#

好问题!我将分两部分回答,第一部分将解释为什么你的示例循环不工作,第二部分将提供一个工作的解决方案(尽管它可能不是特别好的优化)。

第一部分

看看这个例子,当你运行循环时,j将是一个包含键的元组,每个教师数据的值对。当您创建k时,它是一个字典。如果您在if j==k:之前添加print语句,您将看到jk是什么。下面是前几个jk的示例第一位老师的答案是:

j = ('ID', 101), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('Salary', 20000), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('ML', 15), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('DL', 10), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('CL', 12), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('P1', '8th'), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('P2', '9th'), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('P3', '10th'), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}
j = ('FP', 4), k = {'P1': '8th', 'P2': '9th', 'P3': '10th'}

如您所见,即使j = ('FP', 4)是元组。当您通过写入if j == k:来测试是否相等时,由于j是元组而k是dict,因此会失败。在相等测试期间会比较对象类型,因此这将失败。注意:相等性测试非常严格,因此j和k必须完全相等(类型和内容)才能返回真。

第二部分

下面的代码应该可以解决你的问题。我已经添加了注解来逐行解释它。
有几点需要注意。
1.首先,我们创建一个名为target_periods的教师缺席时段列表。您会注意到,我用“”替换了“P”,然后将结果转换为整数。这确保时段编号的格式与我们稍后比较的FP值相同。
1.接下来,当我们开始遍历教师时,我们需要跳过缺席的教师。
1.最后,当我们遍历剩下的教师时,我们只对他们的FP感兴趣,所以我们可以通过它的键直接访问它,并检查它是否在我们的目标时段列表中。
如果你需要任何进一步的澄清请告诉我。

a=input("Enter Teacher name")

# Get the periods of the absent teacher in a simple list
target_periods = [int(period.replace('P','')) for period in dic1[a].keys() if period.startswith('P')]

for teacher, data in dic1.items():  # Loop through the teachers and their data
    if teacher == a: # Skip the absent teacher
        continue
    elif data['FP'] in target_periods: # Check if the teacher has a period in common with the absent teacher
        print(f'Teacher: {teacher} has period {data["FP"]} in common with {a}')
91zkwejq

91zkwejq2#

你的字典其实没什么毛病--它可以照原样使用。
你首先需要检查指定的教师(输入)是否在字典中,如果是,那么分离出Pn键(它们的值是不相关的),将Pn键的数字部分添加到集合中。
现在遍历主字典。忽略输入的教师。获取FP值并检查它是否在先前构造的集合中。
相应输出:

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}}

teacher = input('Enter teacher name: ')

if teacher in dic1:
    p = set()
    for k in dic1[teacher].keys():
        if k.startswith('P'):
            p.add(int(k[1:]))
    for k, v in dic1.items():
        if k != teacher and v.get('FP') in p:
            print(k)
else:
    print('Unknown teacher')
    • 输出:**
T2
T3
T4

相关问题