2015-10-27 114 views
2

我創建的所有排列的名單可以說0,1,2排列索引,蟒蛇

perm = list(itertools.permutations([0,1,2])) 

這是用於在特定的順序訪問在另一個列表索引。每次訪問索引時都會彈出。 當元素彈出時,索引高於彈出元素索引的元素將向下移動一個位置。這意味着如果我想通過索引[0,1,2]從我的列表中彈出,它將導致索引錯誤,因爲索引2到達時不會存在。 [0,1,2]應該按順序彈出[0,0,0]。

更多的例子是

[0,2,1] = [0,1,0] 
[2,0,1] = [2,0,0] 
[1,2,0] = [1,1,0] 

現在這正在通過一系列的檢查,處理,我的問題是,如果有人知道一個聰明的方式轉由itertools生成到所需的列表列出的清單:

[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] 
[(0, 0, 0), (0, 1, 0), (1, 0, 0), (1, 1, 0), (2, 0, 0), (2, 1, 0)] 

回答

4

只需通過每個元組迭代,和減少比該元件更大的每個隨後的索引的索引:

l=[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] 
def lower_idxs(lst): 
    new_row = list(lst) 
    for i, val in enumerate(new_row): 
     for j in xrange(i+1, len(new_row)): 
      if new_row[i] < new_row[j]: 
       new_row[j] -= 1 
    return new_row 

print [lower_idxs(x) for x in l] 

會打印出

[[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 0], [2, 0, 0], [2, 1, 0]] 

這是基於蘭迪C'S解決方案票友一行代碼:

print [tuple(y-sum(v<y for v in x[:i]) for i,y in enumerate(x)) for x in l] 
+0

謝謝!這解決了它!將使用此:D – NicolaiF

+0

@RandyC當然,並給了你一個upvote – jh314

2

這裏是一個一行它(假設你的名單L):

[v-sum(v>v2 for v2 in l[:k]) for k, v in enumerate(l)] 
+0

整潔的解決方案,真正複雜的代碼閱讀! :d – NicolaiF