2016-11-26 1 views
0

Я пишу функцию, чтобы взять новую карту из колоды карт, учитывая, что из колоды уже есть карты."ValueError: list.remove (x): x not in list", из-за случайных чисел?

def trekken(getrokken = []): 
    import itertools 
    import random 

    getrokken = list(getrokken) 
    kind = 'HCDS' 
    value = '123456789XJQKA' 
    deck = ["".join(card) for card in itertools.product(value,kind)] 
    for i in range(0, len(getrokken)-1): deck.remove(getrokken[i]) 
    return(deck[(random.randint(1, len(deck)))]) 

Когда я использую это для некоторых примеров несколько раз я иногда получаю сообщение об ошибке:

line 16, in trekken 
    print(deck[(random.randint(1, len(deck)))]) 
IndexError: list index out of range 

Например, при следующем входе:

trekken(['6H', '3C', '3D', '8C', 'AD', '9D', '7D', 'QC']) 

Может быть, не первый раз , но после нескольких попыток (максимум 20) я всегда получаю это сообщение об ошибке.

+0

random.randint (low, high) также даст высокий уровень, поэтому len (deck) может не быть хорошим кандидатом на высокий уровень, лучше выбрать значение меньше на единицу, поэтому попробуйте вместо этого «return (deck [random.randint (0 , len (колода) -1)]). Примечание. Индекс списка в Python начинается с '0' not '1', как на других языках, таких как' R'. – Dilettant

+2

Почему бы просто не использовать 'deck = [" ".join (card) для карты в itertools.product (value, kind), если '.join (card) не в getrokken]'? Обратите внимание, что ваш 'range()' исключает из рассмотрения самую последнюю карту. –

+2

FYI http://stackoverflow.com/q/1132941/3001761 – jonrsharpe

ответ

1

В Python random.randint(low, high) также даст high, таким образом len(deck) не может быть хорошим кандидатом на высокий, лучше выбрать значение меньше на единицу, так попробуйте вместо этого как последнюю строку:

return deck[random.randint(0, len(deck)-1)] 

Или еще более ясно, - как @jonrsharpe предлагает:

return deck[random.randrange(len(deck))] 

... или как Мартейн Питерс предлагает:

return random.choice(deck) 

Примечание: Индекс списка в Python начинается с 0, а не 1, как на других языках, например R.

+1

Или просто используйте 'randrange (len (deck))'? – jonrsharpe

+0

@jonrsharpe спасибо, обновил ответ. – Dilettant

+0

Спасибо, это решило проблему! – Roelland

Смежные вопросы