【问题标题】:How to loop through a constantly updating list?如何遍历不断更新的列表?
【发布时间】:2019-10-15 06:20:52
【问题描述】:
for i in range(0, len(list_stops)):
    for j in range(1, len(list_stops[i])):
        current = stops_from_stop(list_stops[i][j])
        list_stops.extend(current)
        for k in range(0, len(current)):
            for m in range(0, len(current[k])):
                list_stops_x.extend([current[k][m]])
            if id_b in list_stops_x:
                #rest of code

list_stops 是一个列表列表。比如[[1,2,3], [4,5,6]]

list_stops_x 是 list_stops 中所有数字的单个列表。例如[1,2,3,4,5,6]。基本上用来作为进入其余代码的条件,最后有一个return语句,所以循环不会重复。

我发现循环在到达list_stops 的第一个版本的最终索引后结束,但我不断扩展list_stops 并希望循环继续进入扩展。因此,例如,如果我在循环中将[7,8,9] 扩展到list_stops,如果找不到id_b,我仍然希望它循环通过[7,8,9],但它会在6 处停止。

注意:这只是整个函数的一部分,但我很确定问题出在此处。这也是入门编程课程,所以一个简单的解决方案就可以了:)完整的代码如下

def find_path(stops, routes, stop_a, stop_b):
    id_a = stop_a[0]
    id_b = stop_b[0]
    unused = unused_stops()
    if id_b in list(unused):
        return []
    total_route = list()
    all_stops = stops_from_stop(id_a)
    list_stops_x = stops_from_stop_x(id_a)
    list_stops = stops_from_stop(id_a)
    for index in range(0, len(all_stops)):
        if id_b in all_stops[index]:
            return find_route(stops, routes, stop_a, stop_b)
    for i in range(0, len(list_stops)):
        for j in range(1, len(list_stops[i])):
            current = stops_from_stop(list_stops[i][j])
            list_stops.extend(current)
            for k in range(0, len(current)):
                for m in range(0, len(current[k])):
                    list_stops_x.extend([current[k][m]])
                    if id_b in list_stops_x:                 
                        stops_used_rev = [id_b]
                        last_route = list_stops[len(list_stops) - 1]
                        current_stop = last_route[0]
                        stops_used_rev += [current_stop]
                        for i in range(0, len(list_stops)):
                            if (current_stop in list_stops[i]) and (list_stops[i][0] == id_a):
                                stops_used_rev += [id_a]
                                break
                            elif current_stop in list_stops[i]:
                                current_stop = last_route[0]
                                stops_used_rev += [current_stop]
                        stops_used = stops_used_rev[::-1]               
                        for index in range(0, len(stops_used) - 1):                     
                            total_route.extend(find_route(stops, routes, stops[stops_used[index]], stops[stops_used[index + 1]]))
                        return total_route

stops_from_stop 查找可从当前停靠点访问的列表停靠点并附加到另一个列表。 stops_from_stops_x 做同样的事情,但改为扩展

【问题讨论】:

  • 我发布的解决方案对您有用吗?如果是,请将其标记为已解决
  • 使用while循环。

标签: python-3.x list loops


【解决方案1】:

所以问题是我们使用 range(0, len(list_stops)) 如果我们改为使用以下方式枚举,小心无限循环,因为我们也不断向列表中添加元素.所以要小心,但这应该会产生预期的结果。我已经更改了部分代码,以便可以运行它。

Enumerate 可以同时获取列表项 (val) 和我们当前所在的索引。

list_stops = [[1,2,3], [4,5,6]]
list_stops_x = [1,2,3,4,5,6]
newer = [[7, 8, 9], [10, 11, 12]]
id_b = 9

for i, val in enumerate(list_stops):
    print(val)
    for j in range(1, len(list_stops[i])):

        current = newer
        list_stops.extend(current)

        for k in range(0, len(current)):
            for m in range(0, len(current[k])):
                list_stops_x.extend([current[k][m]])

            # if id_b in list_stops_x:
            #     print("id_b in")
            #     break

编辑 1

在编辑建议中的代码中,您的循环如下所示:

for i in range(0, len(list_stops)):
   ...

这些应该替换为以下内容以解决问题

for i, val in enumerate(list_stops):
   ...

我很难测试代码,但尝试用我提供的类型替换 for 循环并告诉我

编辑 2

如果我们继续添加到列表中,它会无限循环,除非我们退出某个地方。您可以看到这个示例,我将元素添加到列表 b 中的列表 a,然后删除该项目。正如你从输出中看到的,我们循环了八次,所以我们知道它有效,你应该在你的代码中反映这些变化

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]


for idx, val in enumerate(a):
    print("Loop Count: " + str(idx))
    if b:
        a.append(b[0])
        b.remove(b[0])
Loop Count: 0
Loop Count: 1
Loop Count: 2
Loop Count: 3
Loop Count: 4
Loop Count: 5
Loop Count: 6
Loop Count: 7

【讨论】:

  • 嗨Shadesfear,很抱歉回复晚了,我只是有机会尝试一下!它没有像我们希望的那样工作。返回答案花了一段时间,答案似乎重复了很多次。难道我的其余代码必须适应你的吗?
  • 好吧,有些可能需要,你能更新你的帖子来告诉我你现在有什么吗?
  • 嗨 shadesfear,我刚刚发布了完整的功能 :)
  • 停靠点和路线只是我导入的 csv 文件
  • 您所做的编辑被拒绝,您应该将它们添加到原始帖子中。我将更新我的答案以反映我认为需要做的事情
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多