【问题标题】:Permutations and indexes, python排列和索引,python
【发布时间】:2015-10-27 14:53:17
【问题描述】:

我创建了一个让我们说 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)]

【问题讨论】:

    标签: python algorithm list permutation combinatorics


    【解决方案1】:

    简单地遍历每个元组,并减少每个大于该元素的后续索引的索引:

    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]]
    

    这是一个基于 Randy C 解决方案的更高级的单线:

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

    【讨论】:

      【解决方案2】:

      这是一个单行字(假设您的列表是 l):

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

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多