首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列表转换为3个列表

将列表转换为3个列表
EN

Stack Overflow用户
提问于 2022-08-24 11:06:43
回答 3查看 44关注 0票数 -2
代码语言:javascript
复制
get_plan= 
[('Depot', 'Addr_3'),
  ('Addr_3', 'Addr_4'),
  ('Addr_4', 'Depot'),
  ('Depot', 'Addr_1'),
  ('Addr_1', 'Addr_2'),
  ('Addr_2', 'Depot'),
  ('Depot', 'Addr_5'),
  ('Addr_5', 'Addr_6'),
  ('Addr_6', 'Depot')]

我怎样才能把这个计划转变成这样的路线列表(一种解决方案,每条路线都在仓库结束,另一条路线从仓库开始)

代码语言:javascript
复制
route_list= 
[[('Depot', 'Addr_3'),
  ('Addr_3', 'Addr_4'),
  ('Addr_4', 'Depot'),]
  [('Depot', 'Addr_1'),
  ('Addr_1', 'Addr_2'),
  ('Addr_2', 'Depot'),]
  [('Depot', 'Addr_5'),
  ('Addr_5', 'Addr_6'),
  ('Addr_6', 'Depot')]]

我一般需要它。

非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2022-08-24 11:09:41

假设输入数据是正确的,并且不需要进行检查,那么使用一个简单的循环。

依靠路线的尽头:

代码语言:javascript
复制
route_list = []
tmp = []
for t in get_plan:
    tmp.append(t)
    if t[1] == 'Depot':
        route_list.append(tmp)
        tmp = []

依靠路线的开始

代码语言:javascript
复制
route_list = []
tmp = []
for t in get_plan:
    if t[0] == 'Depot':
        if tmp:
            route_list.append(tmp)
        tmp = [t]
    else:
        tmp.append(t)
route_list.append(tmp)

产出:

代码语言:javascript
复制
[[('Depot', 'Addr_3'), ('Addr_3', 'Addr_4'), ('Addr_4', 'Depot')],
 [('Depot', 'Addr_1'), ('Addr_1', 'Addr_2'), ('Addr_2', 'Depot')],
 [('Depot', 'Addr_5'), ('Addr_5', 'Addr_6'), ('Addr_6', 'Depot')]]
票数 0
EN

Stack Overflow用户

发布于 2022-08-24 11:19:01

您可以使用来自split_before迭代工具

代码语言:javascript
复制
from more_itertools import split_before

list(split_before(get_plan, lambda x: x[0] == 'Depot'))
票数 0
EN

Stack Overflow用户

发布于 2022-08-24 12:31:19

您可以使用这样的numpy来实现这一点。

代码语言:javascript
复制
import numpy as np

get_plan = [('Depot', 'Addr_3'),
            ('Addr_3', 'Addr_4'),
            ('Addr_4', 'Depot'),
            ('Depot', 'Addr_1'),
            ('Addr_1', 'Addr_2'),
            ('Addr_2', 'Depot'),
            ('Depot', 'Addr_5'),
            ('Addr_5', 'Addr_6'),
            ('Addr_6', 'Depot')]

# create a numpy array
np_arr = np.array(get_plan)
# Find the indices on which to split the array
indices, = np.nonzero(np_arr[:, 0] == "Depot")
# Split the array
route_list = [sub.tolist() for sub in np.split(np_arr, indices) if sub.size]
print(route_list)

输出:

代码语言:javascript
复制
[[['Depot', 'Addr_3'], ['Addr_3', 'Addr_4'], ['Addr_4', 'Depot']], 
[['Depot', 'Addr_1'], ['Addr_1', 'Addr_2'], ['Addr_2', 'Depot']],
[['Depot', 'Addr_5'], ['Addr_5', 'Addr_6'], ['Addr_6', 'Depot']]]

如果您想要元组而不是列表,可以将sub.tolist()替换为list(map(tuple, sub))

代码语言:javascript
复制
route_list = [list(map(tuple, sub)) for sub in np.splite(np_arr, indices) if sub.size]

产出:

代码语言:javascript
复制
[[('Depot', 'Addr_3'), ('Addr_3', 'Addr_4'), ('Addr_4', 'Depot')], 
[('Depot', 'Addr_1'), ('Addr_1', 'Addr_2'), ('Addr_2', 'Depot')], 
[('Depot', 'Addr_5'), ('Addr_5', 'Addr_6'), ('Addr_6', 'Depot')]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73472027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档