擅长:python、mysql、java
<p>一种解决方案:</p>
<pre><code>def fixed_shuffle(lst):
unfrozen_indices, unfrozen_subset = zip(*[(i, e) for i, e in enumerate(lst)
if not e.freeze])
unfrozen_indices = list(unfrozen_indices)
random.shuffle(unfrozen_indices)
for i, e in zip(unfrozen_indices, unfrozen_subset):
lst[i] = e
</code></pre>
<p>注意:如果<code>lst</code>是一个<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html" rel="nofollow noreferrer">numpy array</a>而不是一个常规列表,则这可能会更简单一些:</p>
^{pr2}$
<p>其用法示例:</p>
<pre><code>class CAnswer:
def __init__(self, x, freeze=False):
self.x = x
self.freeze = freeze
def __cmp__(self, other):
return self.x.__cmp__(other.x)
def __repr__(self):
return "<CAnswer: %s>" % self.x
lst = [CAnswer(3), CAnswer(2), CAnswer(0, True), CAnswer(1), CAnswer(5),
CAnswer(9, True), CAnswer(4)]
fixed_shuffle(lst)
</code></pre>