0

我有两个列表,一个是主题列表,最多可以有 2 到 4 个主题。第二个列表是报告列表,它提供信息,我们是否需要该主题的报告。

报告列表的可能值为:

  • All_Subjects 这意味着我们需要所有主题的报告。
  • No_Subject 这意味着我们不需要任何主题的报告
  • 最后是格式,SubjectName_(All|NO)_Report,这意味着对于特定主题,我们是否需要报告。-subject_list = ["Subject", "Chemistry", "Physics" , "Mathematics" , "Bio"] #sequence 始终保持不变。
  • 报告列表可以是 ["All_Subjects", "No_Subjects", "Chemistry_No_Report","Chemistry_All_Report"] #sequence 无所谓

函数report_required 无论我们是否想要报告都会返回一个列表,并返回一个列表。如果列表包含所有“无”值,则表示不需要报告。

例如:我有:

reporting_list = ["Chemistry_No_Report", "Mathematics_All_Report] 
subject_list   = ["Subject", "Chemistry", "Physics" , "Mathematics"] 

我的 subject_list 始终以值 Subject 开头,在返回映射值时我会忽略它,
我的返回值应该是["No", None, "Yes"]

我当前的以下功能有效,是否有一种更有效的方法可以根据两个列表值映射出第三个列表。

def reportRequired( reporting_list , subject_list):

    report_list = [None]*4


    for value in reporting_list:
                # subject_list starts with a header value "Subject", thats why iterating from index 1
                if value.startswith("All"):
                   for idx in range(1, len(subject_list)):
                        report_list[idx-1] = "Yes"

                if value.startswith("No"):
                    for idx in range(1, len(subject_list)):
                        report_list[idx-1] = "No"


                if value.split("_")[1].lower() == "no":
                    for idx in range(1, len(subject_list)):
                        if value.split("_")[0].strip() == subject_list[idx]:
                            report_list[idx-1] = "No"

                if value.split("_")[1].lower() == "all":
                    for idx in range(1, len(subject_list)):
                        if value.split("_")[0].strip() == subject_list[idx]:
                            report_list[idx-1] = "Yes"
      return report_list
4

1 回答 1

0

构建一个将主题名称映射到索引的字典,并使用它来访问 report_list 的元素。这样,您可以避免第 3 种和第 4 种情况的二次复杂度。

对于第一种和第二种情况:准备一个用 Yes-es 填充的列表和一个用 No-s 填充的列表。然后您可以使用它们,无论该案例在报告列表中出现的频率如何。注意:您可以使用 ['Yes']*4,就像在 report_list 的初始化中所做的那样。

总体复杂性“几乎”是线性的(假设 O(1) 字典访问......)

编辑:如果一个主题可以在主题列表中出现多次,这不起作用。但是您可以构建一个字典,在其中存储每个主题的答案,然后在第二阶段,遍历主题列表并输出每个主题的答案。

于 2013-03-20T19:59:23.937 回答