a_string = 'abc'
destination = [2, 3]
edges = { (1, 'a') : [2, 3],
(2, 'a') : [2],
(3, 'b') : [4, 3],
(4, 'c') : [5] }
def make(a_string, destination, edges):
n = 0
while n + 1 < len(a_string):
letter = a_string[n]
letter2 = a_string[n + 1]
for d in destination: # (1)
if (d, letter2) in edges:
for state in edges[(d, letter2)]:
destionation.append(state)
destination.remove(d)
n += 1 # (2)
return destination
代码返回[]
,但我希望看到[5]
,所以我认为问题是它会意外地增加n
然后更改letter2
。
为什么在完成n
循环(位置1)之前,此代码会增加for
(在位置2)?
答案 0 :(得分:1)
n不会递增。 您可能缺少的是while循环检查n + 1而不是n。
现在编辑我们有更多信息:
问题是您要从具有未定义行为的迭代器中删除项目。
试
for d in destination[:]:
这是整个数组的切片运算符,因此它充当复制构造函数。 您现在正在循环其他对象,并且删除应该是安全的。
答案 1 :(得分:0)
如果在循环结束时没有添加1到n,则循环条件保持不变,循环将永久执行。它不是在for循环中执行,而是在while循环体中执行。 (缩进确定一行所属的代码块!)
答案 2 :(得分:0)
你也可以迭代字符串,并使用index
字符串方法,你可以抓住字符的下一个位置。
将这两者结合起来,可以简化初始外循环:
def make(a_string, destination, edges):
for letter in a_string:
while a_string.index(letter)+1 < len(a_string):
next_letter = a_string[a_string.index(letter)+1]
此外,您不应将变量命名为string
,因为它是模块的名称。