Перемешать список питонов без использования встроенной функции

Я работаю над написанием двух разных функций перемешивания.

Первая функция перемешивания должна взять список и вернуть новый список с элементами, перетасованными в случайном порядке.

Это то, что у меня есть для первой функции случайного

def shuf(List):
    import random
    newList=[]
    for i in List:
        i=random.randrange(len(List))
        newList+=i
    return newList

Вторая функция перемешивания принимает список в качестве параметра и перетасовывает список на месте.

Я знаю, как сделать это с помощью встроенной функции, но мне не разрешено ее использовать.

5 ответов

Вы можете обнаружить, что эта реализация для перетасовки соответствует вашим потребностям. Убедитесь, что вы заметили разницу между двумя функциями, прежде чем использовать их.

>>> import random
>>> def shuffle(array):
    copy = list(array)
    shuffle_in_place(copy)
    return copy

>>> def shuffle_in_place(array):
    array_len = len(array)
    assert array_len > 2, 'Array is too short to shuffle!'
    for index in range(array_len):
        swap = random.randrange(array_len - 1)
        swap += swap >= index
        array[index], array[swap] = array[swap], array[index]


>>> array = list(range(10))
>>> array
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> shuffle(array)
[7, 2, 3, 5, 8, 6, 0, 1, 9, 4]
>>> array
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> shuffle_in_place(array)
>>> array
[8, 3, 1, 6, 9, 7, 0, 4, 2, 5]
>>> 

Вам нужно выполнить этот код:

      import random

#define the lists
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = []
run = True

#main code
while run:
    var1 = random.choice(list1)
    var2 = list1.pop(var1)
    list2.append(var2)
    if len(list1) == 0:
        run = False
print (list2)
#output = [randomised list]

Вы можете использовать это:

import random
def shuffle(lst):
     return sorted(lst ,key = lambda i,random.ramdom())

Вдохновлен реализацией исходного кода Python для перемешивания в случайном модуле.

        import random

  def shuffle(A):
      last_index = len(A) - 1

      while last_index > 0:
          rand_index = random.randint(0, last_index)
          A[last_index], A[rand_index] = A[rand_index], A[last_index]
          last_index -= 1

      return A

План: просмотреть список с самого начала, начиная с элемента 0; найдите для него новую случайную позицию, скажем 6, поместите значение 0 в 6 и значение 6 в 0. Перейдите к элементу 1 и повторите этот процесс, и так далее до конца списка.

import random
iteration = random.randint(2, 100)
temp_var = 0
while iteration > 0:
    # We will be swapping the value of i for j.
    # And then setting j to what i was using the temp_var place holder.
    for i in range(1, len(my_list)): # have to use range with len()
        for j in range(1, len(my_list) - i):
            # Using temp_var as my place holder so I don't lose values
            temp_var = my_list[i]
            my_list[i] = my_list[j]
            my_list[j] = temp_var

        iteration -= 1
Другие вопросы по тегам