比较嵌套字典之间的键值



我想比较嵌套字典。

classes= {
"class1" : {
"name" : "Math",
"hour" : [4,5]
},
"class2" : {
"name" : "Bio",
"hour" : [3,4]
},
"class3" : {
"name" : "Chem",
"hour" : [5,6]
}
}

我需要知道课程在哪个时间重叠。所以,输出应该是这样的:

Math and Bio overlap at hour 4
Math and Chem overlap at hour 5

您可以创建一个更适合您想要的od查询类型的数据结构。例如,制作一个包含小时键和这些小时的类列表的词典。

from collections import defaultdict
classes = {
"class1" : {
"name" : "Math",
"hour" : [4,5]
},
"class2" : {
"name" : "Bio",
"hour" : [3,4]
},
"class3" : {
"name" : "Chem",
"hour" : [5,6]
}
}
hours = defaultdict(list)
for c in classes.values():
for hour in c['hour']:
hours[hour].append(c['name'])

hours将是类似于的结构

{4: ['Math', 'Bio'], 5: ['Math', 'Chem'], 3: ['Bio'], 6: ['Chem']})        

这将允许你在几个小时内迭代,并过滤掉那些没有超过一个类的:

for hour, cs in hours.items():
if len(cs) > 1:
print(f"{' and '.join(cs)} overlap at hour {hour}")

打印:

Math and Bio overlap at hour 4
Math and Chem overlap at hour 5

附带说明一下,您的字典类可能应该是一个类似[{"name": "Math","hour": [4,5]}, {...}, ...]的列表。这一点的一个很好的指示是没有任何语义的数字递增键:class1class2等。

假设字典的结构保持不变,即嵌套字典的键的命名约定为类名和类持续时间的"name""hour"。此外,假设嵌套字典的"hour"键中的两个值是类的开始和结束时间,即类的范围,则可以通过以下两个简单步骤来解决该问题。

首先,我们定义了一个函数,该函数返回任意两个类之间的小时重叠列表,并将嵌套字典中的两个"hour"键作为输入。

def get_overlap(l1:list, l2:list):
r1 = range(l1[0], l1[1]+1)
r2 = range(l2[0], l2[1]+1)

return [i for i in r1 if i in r2]

现在,我们对主字典进行迭代,只将每个关键字与其他关键字进行一次比较。,即"class1"["class2", "class3", "class4"]"class2"["class3", "class4"]"class3"["class4"]

for i, k1 in enumerate(classes):
for k2 in list(classes)[i+1:]:
ovlp = get_overlap(classes[k1]['hour'], classes[k2]['hour'])
if len(ovlp):
print(f"{classes[k1]['name']} and {classes[k2]['name']} overlap at hour(s) {ovlp}")

现在,取一本字典如下:

classes= {
"class1" : {
"name" : "Math",
"hour" : [4,5]
},
"class2" : {
"name" : "Bio",
"hour" : [3,4]
},
"class3" : {
"name" : "Chem",
"hour" : [5,6]
},
"class4" : {
"name" : "Phy",
"hour" : [4,6]
}
}

我们得到的输出:

Math and Bio overlap at hour(s) [4]
Math and Chem overlap at hour(s) [5]
Math and Phy overlap at hour(s) [4, 5]
Bio and Phy overlap at hour(s) [4]
Chem and Phy overlap at hour(s) [5, 6]

最新更新