2016-10-02 80 views
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) 

我想这(对每一个订单一个LC):

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

,而不是这样的:

[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] 
+0

您的代码似乎不起作用。您每次迭代创建一个新LC只返回最后一个LC。你期待什么作为输出? –

+0

在我的机器上工作,我把它放在输出下面。 “解决方案”列表存储所有LC创建的列表。 – HarpMan

+0

您的初始代码与您编辑的代码不同。 –

回答

1

该解决方案基本相同,你提出了一个,但更多的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] 
2

你可以使用其他技术,如理解。下面将返回一个平坦的列表:

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

和下面将返回一个2D名单:

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

扩展列表非常有效。 –

+0

@PadraicCunningham - 有一次,当然,但它必须每次创建新列表,所以重复执行并不是最好的(同样的原因'sum(lists,[])'通常被避免)。 – TigerhawkT3

+0

你很混淆'l = l + some_list'和'l + = some_list'都会做很不同的事情。 'l + = some_list'与'l.extend(some_list)'完全相同。如果OP具有正确的代码,LC将在所有循环之外创建并且每次都延长。 –

1

就叫itertools.chain的指标,并结合了operator.itemgetter

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

In [10]: orders = [[0, 2, 1], [1, 0, 2], [2, 1, 0]] # Ord 

In [11]: from itertools import chain 

In [12]: from operator import itemgetter 


In [13]: [list(chain(*itemgetter(*o)(groups))) for o in orders] 
    [[0, 3, 7, 5, 2, 6, 1, 4], [2, 6, 1, 4, 0, 3, 7, 5], [3, 7, 5, 2, 6, 1, 4, 0]] 

在你自己的代码,你只能回到过去的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 
+0

这是因为我需要个人信用证,而不是所有的信用证。 – HarpMan

+0

@RafaelFrinhani,你的代码仍然只返回你创建的最后一个,所以它不可能做你想做的。 –

+0

您好坎宁安先生,我把更多的信息,我的问题,以更好地阐明我想要什么。 – HarpMan

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

result = [input_element for order in orders for order_element in order for input_element in inputs[order_element]] 
print(result) 
+0

如果您不使用它,为什么要导入'reduce'? –

+0

@vishes_shell抓了一条不想要的行:) –