Python 第二次迭代不';行不通
我必须回答的问题是: 使用签名实现函数Python 第二次迭代不';行不通,python,Python,我必须回答的问题是: 使用签名实现函数 def expand_one_or(course_lists): 此函数获取字符串列表,以及 修改如下: 它在出现“/”的课程列表中查找第一个列表(称为lis) 然后找到lis中第一个“/”的坐标(比如i) 如果lis[i-1]和lis[i+1]存在并且都是课程,则课程_列表中的lis将替换为两个新列表:一个与lis相同但具有 lis[i]和lis[i+1]已删除,列表与lis相同,但具有 lis[i]和lis[i-1]已删除 否则,将从lis中删除l
def expand_one_or(course_lists):
此函数获取字符串列表,以及
修改如下:
- 它在出现“/”的课程列表中查找第一个列表(称为lis)
- 然后找到lis中第一个“/”的坐标(比如i)
- 如果lis[i-1]和lis[i+1]存在并且都是课程,则课程_列表中的lis将替换为两个新列表:一个与lis相同但具有 lis[i]和lis[i+1]已删除,列表与lis相同,但具有 lis[i]和lis[i-1]已删除
- 否则,将从lis中删除lis[i]
[ ["CSC148H1", "/", "CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/",
"CSC148H1", ";", "/"] ]
展开或查找第一个“/”,并将课程列表修改为
[ ["CSC148H1", ",", "CSC165H1", "/", "CSC240H1", "/", "CSC148H1", ";", "/"],
["CSC150H1", ",", "CSC165H1", "/", "CSC240H1", "/", "CSC148H1", ";", "/"] ]
如果我们在结果列表上运行expand_一次或第二次,我们
得到
我用来做这件事的代码是:
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', ';', '/']]
这是错误的输出。请尝试以下操作:
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
def拆分列表(l,i):
返回[l[:i]+l[i+2:],l[:i-1]+l[i+1:]
def展开一个或(课程列表):
k=0
累加器=[]
对于课程列表中的lis:
如果lis中的k==0且“/”:
k=1
i=列表索引(“/”)
如果i>0且i
您可以发布样本输出吗?你所说的“不起作用”具体是什么意思。您的实现有很多问题。例如,它在分解找到的第一行后不会退出(这可能是它第二次失败的原因)。此外,内部循环中的i永远不会等于len(lis)“此代码在第一次迭代中起作用,但在第二次迭代中不起作用。”。哪个循环的迭代?发生这种情况时,课程列表是什么?等一下,我会编辑整个问题。当我尝试这段代码时,它会说“TypeError:只能连接列表(而不是“str”)以列出您使用的输入?当我尝试使用您的输入时,它提供了预期的输出。是否确实要将列表列表作为输入传递给展开\或?
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