Python shuffle such that position will never repeat

python, random, shuffle

Solution

Randomize in a loop and keep rejecting the results until your condition is satisfied:

import random

def shuffle_list(some_list):
    randomized_list = some_list[:]
    while True:
        random.shuffle(randomized_list)
        for a, b in zip(some_list, randomized_list):
            if a == b:
                break
        else:
            return randomized_list

Problem

I'd like to do a random shuffle of a list but with one condition: an element can never be in the same original position after the shuffle. Is there a one line way to do such in python for a list? Example: ``` list_ex = [1,2,3] ``` each of the following shuffled lists should have the same probability of being sampled after the shuffle: ``` list_ex_shuffled = [2,3,1] list_ex_shuffled = [3,1,2] ``` but the permutations [1,2,3], [1,3,2], [2,1,3] and [3,2,1] are not allowed since all of them repeat one of the elements positions. NOTE: Each element in the list_ex is a unique id. No repetition of the same element is allowed.

Original source

Related problems