2016-10-02 78 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抓了一條不想要的行:) –