Перемешать список питонов без использования встроенной функции
Я работаю над написанием двух разных функций перемешивания.
Первая функция перемешивания должна взять список и вернуть новый список с элементами, перетасованными в случайном порядке.
Это то, что у меня есть для первой функции случайного
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