Python:改组列表,但保持某些元素冻结


问题内容

我有一个问题:

有一个class元素的列表CAnswer(无需描述该类),我需要对其进行混洗,但是有一个约束-
列表中的某些元素已CAnswer.freeze设置为True,并且这些元素一定不能混洗,而应保留在它们的上面原始职位。因此,对于给定的列表,让我们说:

[a, b, c, d, e, f]

如果所有元素都是的实例CAnswer,但是c.freeze == True,对于其他元素freeze == False,可能的结果可能是:

[e, a, c, f, b, d]

因此索引为2的元素仍处于其位置。

实现它的最佳算法是什么?

先感谢您 :)


问题答案:

另一个解决方案:

# memorize position of fixed elements
fixed = [(pos, item) for (pos,item) in enumerate(items) if item.freeze]
# shuffle list
random.shuffle(items)
# swap fixed elements back to their original position
for pos, item in fixed:
    index = items.index(item)
    items[pos], items[index] = items[index], items[pos]