операторы random.choices и if /else

#python #python-3.x #python-3.8

#python #python-3.x #python-3.8

Вопрос:

Я пытаюсь составить список, чтобы у вас было имя, их поведение и действие. Кажется, я просто не могу заставить свое if/else утверждение работать. Он выбирает только мой else . Никогда не мой if , хотя это должно иметь более высокую вероятность. Это мой код:

 import random

Names = ['john', 'james', 'dave', 'ryan']
behaviour = ['good', 'bad']
good = ['candy', 'presents', 'hug']
bad = ['get coal', ' have to stand in the corner']
for i in Names:
    n = random.choices(behaviour,weights=(3,1))
    k = random.choice(bad)
    if n=='good':
         print('{} was good this year therefor they get {}'.format(i,random.choice(good)))
    else:
         print('{} was bad this year therefor they {}'.format(i,random.choice(bad)))
 

все мои вещи — это просто название, которое было плохим в этом году, поэтому они получают, а затем либо уголь, либо угол…..

Комментарии:

1. Попробуйте выполнить print(n) , и вы обнаружите проблему

2. Добро пожаловать в Stack Overflow! Пожалуйста, прочитайте о том, как отлаживать небольшие программы . Вы также можете использовать Python-Tutor , который помогает визуализировать пошаговое выполнение кода.

Ответ №1:

Из документации:

random.choices(population, weights=None, *, cum_weights=None, k=1)

Возвращает список элементов размером k

Он вернет список, но вы сравниваете его с одной строкой 'good' — они никогда не будут одинаковыми, и там он всегда выбирает else блок.

Вы могли бы, например:

     if n == ['good']:
         print('{} was good this year therefor they get {}'.format(i,random.choice(good)))
    else:
         print('{} was bad this year therefor they {}'.format(i,random.choice(bad)))
 

Или:

     if n[0] == 'good':
 

Комментарии:

1. Рад помочь, если вы считаете, что какой-либо из ответов достаточно хорош, пожалуйста, примите его с галочкой, чтобы вопрос был отмечен как ответ, и другие могли найти его как решаемый.

Ответ №2:

Это потому random.choices , что возвращает список, поэтому он никогда не будет равен строке (например 'good' ).

Измените его на:

 n = random.choices(behaviour, weights=(3,1))[0]
 

Ответ №3:

Random.choices выдает список с одним элементом. Чтобы выполнить сравнение со строкой «good», вам нужно проиндексировать этот элемент с помощью n[0]

 if n[0]=='good':
         print('{} was good this year therefor they get {}'.format(i,random.choice(good)))
 

Я считаю полезным использовать оператор print для сравнения переменных и проверки того, что они соответствуют тому, что я думаю. Это хороший способ проверить наличие проблем. Тестовая печать, подобная этой

 print(n, 'good', n=='good', str(n)=='good')
 

перед тем, как операторы if выдадут этот вывод

 ['good'] good False False
 

что довольно поучительно относительно того, в чем проблема.