【问题标题】:I have a route of a car but how can i make it simple(by using list)我有一条汽车路线,但我怎样才能让它变得简单(通过使用列表)
【发布时间】:2022-01-14 08:36:07
【问题描述】:

我有一个类似的列表:

A=[(0, 16), (1, 11), (2, 4), (3, 14), (4, 8), (5, 15), (6, 13), (7, 2), (8, 20), (9, 17), (10, 5), (11, 12), (12, 6), (13, 7), (14, 0), (15, 1), (16, 19), (17, 18), (18, 10), (19, 9), (20, 3)]

这是一辆车的路线。例如,这辆车从 0 到 16(0,16) 出发,然后从 16 到 19(16,19),然后从 19 到 9 等等。 对于大型数据集,很难遵循这条路线。 我尝试编写循环但无法成功。我必须将此 A 列表转换为另一个列表,例如

B=[0,16,19,9,17,18,10,5,15,1,11,12,6,13,7,2,4,8,20,3,14,0]

【问题讨论】:

  • 第一个和第二个元素是路由的组合吗?比如0到16、19到9、17到18?
  • 它总是从 0 开始还是总是从列表中的第一个元组开始?如果列表中的第一个元组是 (12, 16),那么 B 会从 12 开始吗?
  • 它是一条汽车路线。每个数字都是一个地址。所以它从 0 开始路线,然后到 16,然后到 19.......

标签: python list for-loop routes


【解决方案1】:

如果您将list A 转换为dictionary,则查找速度会快得多:

A_dict = dict(A)

start = 0
route = [start]
frm = start
while True:
    to = A_dict[frm]
    route.append(to)
    frm = to
    if to == start:
        break
print(route)

对于您给定的A,您将获得route

[0, 16, 19, 9, 17, 18, 10, 5, 15, 1, 11, 12, 6, 13, 7, 2, 4, 8, 20, 3, 14, 0]

图形的边存储在A_dict

{0: 16, 1: 11, 2: 4, 3: 14, 4: 8, 5: 15, 6: 13, 7: 2, 8: 20, 9: 17, 10: 5, ...}

如果您在列表A 中查找下一跳,您的方法的整体性能将是二次的(在列表A 的长度中)。使用字典的方法在A的长度上线性增长。


略短的版本:

start = 0
route = [start]
while True:
    route.append(to := A_dict[route[-1]])
    if to == start:
        break

【讨论】:

  • dang,我在这上面花了几分钟,但看起来你在 13 分钟前有相同的解决方案。 +1
  • @enke 谢谢!我会回报的。 +1
【解决方案2】:

您似乎想要展平列表 (Transform "list of tuples" into a flat list or a matrix):

flattened = [item for sublist in l for item in sublist]

【讨论】:

  • 这不是 OP 想要的。他们想要的结果不是[0, 16, 1, 11, ...],这是您通过展平列表得到的结果。
  • 一定误解了问题中想要的结果B
【解决方案3】:

您可以分两步获得您想要的清单:

(i) 将A 转换为字典。这样我们就可以像汽车一样遍历A

dict_A = dict(A)

(ii) 现在遍历dict_A,每次到达一个元组时,将第一个元素添加到out,然后根据dict_A 前往下一个目的地。你这样做直到你回到out的开头。

out = [A[0][0]]
while True:
    out.append(dict_A[out[-1]])
    if out[-1] == out[0]:
        break

输出:

[0, 16, 19, 9, 17, 18, 10, 5, 15, 1, 11, 12, 6, 13, 7, 2, 4, 8, 20, 3, 14, 0]

【讨论】:

    【解决方案4】:

    如果有帮助,这里是一个递归实现。

    # convert routes to dict
    route_dict = dict(A)
    # create empty list for storing results
    route_dict_updated = []
    
    def traverse(node, visited=[]):
        # return if node is already visited
        if node in visited:
            return
        route_dict_updated.append(route_dict[node])
        # add node to visited
        visited.append(node)
        # recurse
        traverse(route_dict[node], visited=visited)
    
    start = 0
    route_dict_updated.append(start)
    traverse(start)
    print(route_dict_updated)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2021-08-23
      • 2021-05-27
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多