2015-10-27 89 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