我有一条汽车路线,但我怎样才能让它变得简单(通过使用列表)
I have a route of a car but how can i make it simple(by using list)
我有一个这样的列表:
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)]
这是一条 car.For 示例的路线,这辆车从 0 到 16(0,16),然后从 16 到 19(16,19),然后从 19 到 9,等等。
对于大数据集,很难遵循这条路线。
我尝试编写循环,但不能 succeed.I 必须将此 A 列表转换为另一个列表,如
B=[0,16,19,9,17,18,10,5,15,1,11,12,6,13,7,2,4,8,20,3,14,0]
您似乎想要展平列表 (Transform "list of tuples" into a flat list or a matrix):
flattened = [item for sublist in l for item in sublist]
如果将 list
A
转换为 dict
ionary,查找速度会快得多:
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
您可以分两步到达您想要的列表:
(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]
如果有帮助,这里是一个递归实现。
# 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)
我有一个这样的列表:
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)]
这是一条 car.For 示例的路线,这辆车从 0 到 16(0,16),然后从 16 到 19(16,19),然后从 19 到 9,等等。 对于大数据集,很难遵循这条路线。 我尝试编写循环,但不能 succeed.I 必须将此 A 列表转换为另一个列表,如
B=[0,16,19,9,17,18,10,5,15,1,11,12,6,13,7,2,4,8,20,3,14,0]
您似乎想要展平列表 (Transform "list of tuples" into a flat list or a matrix):
flattened = [item for sublist in l for item in sublist]
如果将 list
A
转换为 dict
ionary,查找速度会快得多:
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
您可以分两步到达您想要的列表:
(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]
如果有帮助,这里是一个递归实现。
# 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)