2015-12-11 2 views
-1
def make_sorted_deck(): 
    ''' Return a sorted deck of cards. Each card is 
     represented by a string as follows: 
     "queen of hearts". The cards are ordered by rank and then suit within rank. 
    :return: The sorted deck of cards, as a list of strings 
    EXAMPLE: make_sorted_deck() == ['2 of spades', '2 of hearts', '2 of clubs', ..., 'ace of clubs', 'ace of diamonds'] ''' 
    #Hint: Use the previous functions and two nested for loops. 
    sorted_deck = [] 
    for i in get_ranks(): 
     for j in get_suits(): 
      sorted_deck.append("{0} of {1}".format(i,j)) 
     return sorted_deck 
    print(make_sorted_deck()) 

def shuffle(deck): 
    ''' Randomly shuffle the cards in deck into a newly created deck of cards (list). 
    :param: deck: A deck of cards 
    :return: A new list, consisting of a random shuffle of deck. 
    EXAMPLE: shuffle(['2 of hearts', '3 of diamonds', 'jack of spades', '2 of clubs']) could return ['jack of spades', '3 of diamonds', '2 of hearts', '2 of clubs'] 
    #REQUIREMENTS: Please implement the following algorithm: Use a while loop to repeatedly pick a random card from deck, remove it, and add it to a newly created list. ''' 

Как бы перетасовать список, созданный make_sorted_deck()?Как перетасовать список в Python

Я знаю, что есть функция, которую я могу импортировать, чтобы перетасовать колоду, но я должен сделать это, чтобы вынуть 1 случайную карту и добавить ее в новый список, чтобы перетасовать список.

+0

Возможный дубликат [Лучший способ рандомизации список строк в Python] (http://stackoverflow.com/questions/1022141/best-way-to-randomize-a-list-of-strings-in-python) – GingerPlusPlus

+1

@GingerPlusPlus Я думаю, что они отличаются друг от друга. См. Окончание комментария OP – Pynchia

ответ

3

Я не буду решать свою домашнюю работу, но позвольте мне дать вам несколько советов:

  • while x: будет цикл до тех пор, как x истинно-иш. Непустой список имеет значение true-ish.

  • вы можете выбрать случайное число x где 0 <= x < n делая x = random.randrange(n) (docs)

  • Вы можете удалить элемент с индексом i из списка l (т.е. l[i]) с помощью l.pop(i) (docs)

0

Другой ответ, который не отвечает на вопрос ОП ...

Чтобы перетасовать список длины n вам нужен список индексов, переходя от 0 к n-1, в случайном порядке ...

Мы начинаем импортировать функцию randrange из random модуля

from random import randrange 

который вызывается следующим образом: randrange(n) возвращает случайное целое число i, 0 <= i <= n-1.

Когда мы выбираем первый случайный индекс, между 0 и n-1 включены, мы имеем, что следующий индекс будет выбран в более узком интервале, и так далее и так далее ...

l = [randrange(n-i) for i in range(n)] 

конечно последнее число в l будет 0, потому что i==n-1 и randrange(1) должны вернуть 0.

Число в l не может быть использовано непосредственно обратиться список перетасовать, , потому что они относятся к положению в списке доступных элементов в определенной точке процедуры перетасовки, так что для каждого числа в п мы должны видеть, сколько элементов уже перемешиваются, и их положение относительно текущего элемента, скажем, что мы хотим сохранить _real_indices в списке, изначально пустой

indices = [] 

мы должны быть осторожными ...

for i in l:      # the randomized, partial indices 
    j = 0       # aux variable 
    while j <= i:     # we will increment j later 
     if j in indices:   # if this number j, smaller than i, is in the 
      i += 1    # list of used indices, i must be incremented 
     j += 1 
    indices.append(i)    # the (possibly) incremented i is stored 

и все для перетасовки.

Здесь я сообщаю короткую сессию IPython, что свидетельствует о правильности такого подхода:

In [1]: from random import randrange 

In [2]: def shuffle(n): 
    l = [randrange(n-i) for i in range(n)] 
    indices = [] 
    for i in l: 
     j = 0 
     while j <= i: 
      if j in indices: i = i+1 
      j = j+1 
     indices.append(i) 
    return indices 
    ...: 

In [3]: sh = shuffle(10) ; print sh ; print sorted(sh) 
[7, 6, 4, 9, 1, 5, 0, 2, 8, 3] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [4]: sh = shuffle(10) ; print sh ; print sorted(sh) 
[6, 9, 5, 1, 4, 3, 0, 2, 8, 7] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [5]: sh = shuffle(10) ; print sh ; print sorted(sh) 
[3, 6, 4, 9, 0, 7, 8, 1, 2, 5] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [6]: 
Смежные вопросы