【发布时间】:2017-05-12 14:57:24
【问题描述】:
我有一个字典列表,表示学生信息系统中某个班级的时段+天数。这是我要汇总的数据:
[
{
'period': {
'name': '1',
'sort_order': 1
},
'day': {
'name': 'A',
'sort_order': 1
}
},
{
'period': {
'name': '1',
'sort_order': 1
},
'day': {
'name': 'B',
'sort_order': 2
}
},
{
'period': {
'name': '1',
'sort_order': 1
},
'day': {
'name': 'C',
'sort_order': 1
}
},
{
'period': {
'name': '3',
'sort_order': 3
},
'day': {
'name': 'A',
'sort_order': 1
}
},
{
'period': {
'name': '3',
'sort_order': 3
},
'day': {
'name': 'B',
'sort_order': 2
}
},
{
'period': {
'name': '3',
'sort_order': 3
},
'day': {
'name': 'C',
'sort_order': 2
}
},
{
'period': {
'name': '4',
'sort_order': 4
},
'day': {
'name': 'D',
'sort_order': 3
}
}
]
我希望将上面的聚合字符串简化为1,3(A-C) 4(D)。请注意,彼此不“相邻”(由对象的sort_order 确定)的对象由, 分隔,而“相邻”记录由- 分隔。
编辑
让我尝试详细说明聚合过程。每个“班级会议”对象都包含一个时期和日期。通常每天大约有 5 个时段,并且这些日子在 A、B、C、D 等之间循环交替。因此,如果我有一个课程在 A 日的第一个时段出现,我们可以将其表示为 1(A)。如果在 A 天的第 1 和第 2 课时上课,其原始形式可能是 1(A),2(A),但可以缩短为 1-2(A)。
某些课程可能不在“相邻”时段或天数中。 A 日的第 1 期和第 3 期可能会出现一堂课,因此其缩写形式为 1,3(A)。但是,如果该课程在 A 日的第 1、第 2 和第 3 节课上,则可以写为 1-3(A)。这也适用于日期,因此如果课程在 A、B 和 C 日的第 1、2 和 3 期发生,那么我们可以将其写为 1-3(A-C)。
最后,如果一个类出现在第 1、2、3 个时段以及 A、B 和 C 日,但也出现在 D 日的第 4 个时段,则其缩写形式为1-3(A-C) 4(D)。
我尝试过的
我想到执行的第一步是将会议对象“分组”到具有以下功能的相关子列表中:
def _to_related_lists(list):
"""Given a list of section meeting dicts, return a list of lists, where each sub-list is list of
related section meetings, either related by period or day"""
related_list = []
sub_list = []
related_values = set()
for index, section_meeting_object in enumerate(list):
# starting with empty values list
if not related_values:
related_values.add(section_meeting_object['period']['name'])
related_values.add(section_meeting_object['day']['name'])
sub_list.append(section_meeting_object)
elif section_meeting_object['period']['name'] in related_values or section_meeting_object['day']['name'] in related_values:
related_values.add(section_meeting_object['period']['name'])
related_values.add(section_meeting_object['day']['name'])
sub_list.append(section_meeting_object)
else:
# no related values found in current section_meeting_object
related_list.append(sub_list)
sub_list = []
related_values = set()
related_values.add(section_meeting_object['period']['name'])
related_values.add(section_meeting_object['day']['name'])
sub_list.append(section_meeting_object)
related_list.append(sub_list)
return related_list
返回:
[
[{
'period': {
'sort_order': 1,
'name': '1'
},
'day': {
'sort_order': 1,
'name': 'A'
}
}, {
'period': {
'sort_order': 1,
'name': '1'
},
'day': {
'sort_order': 2,
'name': 'B'
}
}, {
'period': {
'sort_order': 2,
'name': '2'
},
'day': {
'sort_order': 1,
'name': 'A'
}
}, {
'period': {
'sort_order': 2,
'name': '2'
},
'day': {
'sort_order': 2,
'name': 'B'
}
}],
[{
'period': {
'sort_order': 4,
'name': '4'
},
'day': {
'sort_order': 3,
'name': 'C'
}
}]
]
如果整个字符串 1-3(A-C) 4(D) 最后是我想要的聚合表达式,让我们调用 1-3(A-C) 和 4(D) “子表达式”。每个相关的子列表都是一个“子表达式”,所以我想我会以某种方式遍历每个子列表并创建子表达式,但我不确定该怎么做。
【问题讨论】:
-
我一个字都听不懂。
-
您的输入和输出之间的关系充其量是令人困惑的。例如,如果
B仅对应于2和3而不是1-3,那么输出字符串将如何形成? -
@asongtoruin 输出将是
1(A) 2-3(A-B) -
sort-order没有意义?
标签: python list dictionary aggregate