Python 按特定顺序合并列表

Python 按特定顺序合并列表,python,list,merge,Python,List,Merge,我有一个列表,我想按特定顺序合并列表。见示例: id list 0 1 2 [[0], [2, 6, 1, 4], [3, 7, 5]] Order Resulting List [1, 0, 2] = [2, 6, 1, 4, 0, 3, 7, 5] [0, 2, 1] = [0, 3, 7, 5, 2, 6, 1, 4] [2, 1, 0] = [3, 7, 5, 2, 6, 1, 4, 0] 有人可以建议一个更优

我有一个列表,我想按特定顺序合并列表。见示例:

id list  0         1           2
       [[0], [2, 6, 1, 4], [3, 7, 5]]

  Order          Resulting List
[1, 0, 2] = [2, 6, 1, 4, 0, 3, 7, 5]
[0, 2, 1] = [0, 3, 7, 5, 2, 6, 1, 4]
[2, 1, 0] = [3, 7, 5, 2, 6, 1, 4, 0]
有人可以建议一个更优雅的算法,建议如下

    groups = [[0], [2, 6, 1, 4], [3, 7, 5]]
    orders = [[1, 0, 2], [0, 2, 1], [2, 1, 0]]

    for order in orders:
        LC = []
        for i in order:
            LC += groups[i]
    return LC
让我更好地解释一下我需要什么:

groups = [[0], [2, 6, 1, 4], [3, 7, 5]] 
orders = [[0, 2, 1], [1, 0, 2], [2, 1, 0]] # Order of each group in LC
solutions = [] # I want to put the created LC here
for order in orders:
    LC = [] # I need this because a want LCs individualy and not one with all 
    for i in order: # for each order I pick de index (i) of the group
         LC += grupos[i] # and merge then according with index of group
        solutions.append([LC])
    print(solutions)
我想要这个(每个订单一个信用证):

而不是这个:

[0, 3, 7, 5, 2, 6, 1, 4, 2, 6, 1, 4, 0, 3, 7, 5, 3, 7, 5, 2, 6, 1, 4, 0]
上面的算法是可行的,但需要一个更优雅、更高效的算法

输出的一些示例:

groups = [[0], [2, 1], [3, 7, 5], [4], [6]]

Order = [1, 0, 2, 3, 4]
LC = [2, 1, 0, 3, 7, 5, 4, 6]

    [2, 1, 0, 3, 4]
    [3, 7, 5, 2, 1, 0, 4, 6]

    [3, 1, 2, 0, 4]
    [4, 2, 1, 3, 7, 5, 0, 6]

    [4, 1, 2, 3, 0]
    [6, 2, 1, 3, 7, 5, 4, 0]

    [0, 2, 1, 3, 4]
    [0, 3, 7, 5, 2, 1, 4, 6]

    [0, 3, 2, 1, 4]
    [0, 4, 3, 7, 5, 2, 1, 6]

    [0, 4, 2, 3, 1]
    [0, 6, 3, 7, 5, 4, 2, 1]

    [0, 1, 3, 2, 4]
    [0, 2, 1, 4, 3, 7, 5, 6]

    [0, 1, 4, 3, 2]
    [0, 2, 1, 6, 4, 3, 7, 5]

    [0, 1, 2, 4, 3]
    [0, 2, 1, 3, 7, 5, 6, 4]

此解决方案基本上与您提出的解决方案相同,但更像Python,使用列表理解

>>> def merge_lists(desired_order):
...     merged_list = [element for i in desired_order for element in parts[i]]
...     return merged_list
... 
>>> desired_order = orders[0]
>>> merge_lists(desired_order)
[2, 6, 1, 4, 0, 3, 7, 5]

此解决方案基本上与您提出的解决方案相同,但更像Python,使用列表理解

>>> def merge_lists(desired_order):
...     merged_list = [element for i in desired_order for element in parts[i]]
...     return merged_list
... 
>>> desired_order = orders[0]
>>> merge_lists(desired_order)
[2, 6, 1, 4, 0, 3, 7, 5]

你可以使用一些其他的技巧,比如理解。以下内容将返回一个简单列表:

return [part for order in orders for i in order for part in parts[i]]
下面将返回一个二维列表:

return [[part for i in order for part in parts[i]] for order in orders]

你可以使用一些其他的技巧,比如理解。以下内容将返回一个简单列表:

return [part for order in orders for i in order for part in parts[i]]
下面将返回一个二维列表:

return [[part for i in order for part in parts[i]] for order in orders]

只需在索引上调用itertools.chain并与operator.itemgetter组合即可:

在您自己的代码中,您只返回最后一个LC,因此它无法正常工作:

for order in orders:
    LC = []  # overwritten each iteration so you only get the last sublists.
    for i in order:
        LC += parts[i]
return LC

只需在索引上调用itertools.chain并与operator.itemgetter组合即可:

在您自己的代码中,您只返回最后一个LC,因此它无法正常工作:

for order in orders:
    LC = []  # overwritten each iteration so you only get the last sublists.
    for i in order:
        LC += parts[i]
return LC


您的代码似乎不起作用。每次迭代创建一个新的LC,只返回最后一个LC。你期望的输出是什么?在我的机器中工作,我把输出放在下面。“解决方案”列表存储所有创建的LC。您的初始代码与编辑的代码不同。抱歉,我试图更清楚地说明。您的代码似乎不起作用。每次迭代创建一个新的LC,只返回最后一个LC。你期望的输出是什么?在我的机器中工作,我把输出放在下面。“解决方案”列表存储所有创建的LC。您的初始代码与编辑的代码不同。抱歉,我试着说得更清楚些。如果你不使用它,为什么要导入
reduce
。@vishes\u shell抓到了一行不需要的代码:)如果你不使用它,为什么要导入
reduce
。@vishes\u shell抓到了一行不需要的代码:)扩展列表非常有效。@padraiccanningham-一次,当然,但它每次都必须创建新的列表,因此重复创建并不是最好的(通常避免使用相同的原因
sum(list,[])
)。您会混淆
l=l+some_list
l+=some_list
这两种方法所做的事情非常不同
l+=some\u list
l.extend(some\u list)
完全相同。如果OP有正确的代码,LC将在所有循环之外创建,并且每次都会扩展。@PadraicCunningham-哦,是的,
list。在同一个列表上扩展与分配新列表相比,是的。我会把它编辑掉。扩展一个列表是非常有效的。@PadraicCunningham-一次,当然,但每次都必须创建新的列表,所以重复这样做不是最好的(同样的原因,
sum(list,[])
通常是可以避免的)。你会混淆
l=l+一些列表
l+=一些列表
两者做的事情非常不同
l+=some\u list
l.extend(some\u list)
完全相同。如果OP有正确的代码,LC将在所有循环之外创建,并且每次都会扩展。@PadraicCunningham-哦,是的,
list。在同一个列表上扩展与分配新列表相比,是的。我会把它编辑掉。这是因为我需要LCs个人,而不是一个包含所有人的列表。@RafaelFrinhani,你的代码仍然只返回你创建的最后一个列表,因此它不可能做你想做的事。嗨,坎宁安先生,我在我的问题中提供了更多信息,以便更好地澄清我想要什么。这是因为我需要LCs个人,没有一个完整的列表。@RafaelFrinhani,您的代码仍然只返回您创建的最后一个列表,因此它不可能执行您想要的操作。嗨,坎宁安先生,我在我的问题中提供了更多信息,以便更好地澄清我想要的内容。