第二次迭代不起作用

时间:2014-12-04 00:12:20

标签: python

我必须回答的问题是:

  

实施带签名的功能

def expand_one_or(course_lists):
     

此函数列出了字符串course_lists的列表,以及   修改如下:

     
      
  • 它在course_lists中找到第一个列表(称之为lis),其中出现“/”。

  •   
  • 然后在lis中找到第一个“/”的坐标(比如说i)。

  •   
  • 如果lis [i-1]和lis [i + 1]存在并且都是课程,则在课程列表中用两个新列表替换lis:与lis相同的列表但是   删除了lis [i]和lis [i + 1],以及与lis相同的列表   

  •   
  • 否则,所有发生的事情都是从lis中移除lis [i]。

  •   
     

例如,如果course_lists是:

[ ["CSC148H1", "/", "CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/",
"CSC148H1", ";", "/"] ]
     

expand_one_or找到第一个“/”,并将course_lists修改为

[ ["CSC148H1", ",", "CSC165H1", "/", "CSC240H1", "/", "CSC148H1", ";", "/"],
["CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/", "CSC148H1", ";", "/"] ]
     

如果我们在结果列表中第二次运行expand_one_or,我们   获得

[ ["CSC148H1", ",", "CSC165H1", "/", "CSC148H1", ";", "/"],
["CSC148H1", ",", "CSC240H1", "/", "CSC148H1", ";", "/"]
["CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/", "CSC148H1", ";", "/"] ]

我以前用的代码是:

c = [ ["CSC148H1", "/", "CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/",
"CSC148H1", ";", "/"] ]
d = [['CSC148H1', ',', 'CSC165H1', '/', 'CSC240H1', '/', 'CSC148H1', ';', '/'], ['CSC150H1', ',', 'CSC165H1', '/', 'CSC240H1', '/', 'CSC148H1', ';', '/']]
def expand_one_or(course_lists):
    accumulator = []
    k = 0
    for lis in course_lists:
        for i in range(len(lis)):
            if lis[i] == '/' and i != len(lis) and k == 0:
                if lis[i - 1].isalnum() and lis[i + 1].isalnum():
                    k = 1
                    list1 = lis[:i] + lis[(i + 2):]
                    list2 = lis[i + 1:]
                    accumulator.append(list1)
                    accumulator.append(list2)

                else:
                    lis.remove(lis[i])
                    k = 1
    return accumulator

此代码用于第一次迭代,但不适用于第二次迭代。

因此,例如,如果我们为函数提供如下列表:

[ ["CSC148H1", "/", "CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/",
"CSC148H1", ";", "/"] ]

它应该给出输出

[['CSC148H1', ',', 'CSC165H1', '/', 'CSC240H1', '/', 'CSC148H1', ';', '/'], ['CSC150H1', ',', 'CSC165H1', '/', 'CSC240H1', '/', 'CSC148H1', ';', '/']]

现在,如果我们再次将此输出代码放入函数中,它应该给出:

[ ["CSC148H1", ",", "CSC165H1", "/", "CSC148H1", ";", "/"],
["CSC148H1", ",", "CSC240H1", "/", "CSC148H1", ";", "/"]
["CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/", "CSC148H1", ";", "/"] ]

问题是我第一次运行该功能时它给了我正确的输出。然而,当我第二次运行它时,它给了我:

[['CSC148H1', ',', 'CSC165H1', '/', 'CSC148H1', ';', '/'], ['CSC240H1', '/', 'CSC148H1', ';', '/']]

这是错误的输出。

1 个答案:

答案 0 :(得分:0)

试试这个:

def split_list(l, i):
  return [l[:i] + l[i+2:], l[:i-1] + l[i+1:]]

def expand_one_or(course_lists):
  k = 0
  accumulator = []
  for lis in course_lists:
    if k == 0 and '/' in lis:
      k = 1
      i = lis.index('/')
      if i > 0 and i < len(lis)-1 and lis[i-1].isalnum() and lis[i+1].isalnum():
        accumulator += split_list(lis, i)
        k = 1
      else:
        accumulator.append(lis[:i] + lis[i+1:])
    else:
      accumulator.append(lis)
  return accumulator