#python #while-loop
Вопрос:
Как остановить цикл while только в том случае, если в каждой группе по 3 участника? (максимальное число для каждой группы-3)
Когда все назначены в группу, цикл должен остановиться и сказать «Готово».
def get_group(): group_1 = [] group_2 = [] while len(group_1) lt;= 3 and len(group_2) lt;= 3: name = input("Tell me your name: ") available_names = ["Tomás", "Fábio", "Rita", "Dany", "Inês", "Ana"] if name in available_names: given_group = random.randint(1, 2) if given_group == 1: group_1.append(given_group) else: group_2.append(given_group) print("You are in group " str(given_group)) else: print("Name not available") else: print("Finish") get_group()
Комментарии:
1. Вы имеете в виду, что хотите продолжать цикл до тех пор, пока в первой группе будет менее 3 участников или во второй группе будет менее 3 участников?
2. Вероятно, вам следует удалять имена по
available_names
мере их группировки.3. Спасибо, что ответили! Я хочу закончить цикл, когда и в группе 1, и в группе 2 будет по 3 участника.
4. Вы правы! Я сделаю это!
5. Вам также нужно будет убедиться, что вы не перенаселяете одну группу.
Ответ №1:
Исправление условного условия с помощью цикла while является частичным решением, но не решает проблему попадания, скажем, в группу 2 4 раза подряд.
Приведенный ниже код выполняет следующее:
- Получает имя
- Генерирует случайную группу
- Проверяет, заполнена ли уже целевая группа
- Если это так, то добавьте в другую группу
- Удаляет имя из доступных имен
def get_group(): group_1 = [] group_2 = [] available_names = ["a", "b", "c", "d", "e", "f"] while True: name = input("Tell me your name: ") if name in available_names: r = random.randint(1, 2) if r == 1: if len(group_1) lt; 3: group_1.append(name) given_group = 1 else: group_2.append(name) given_group = 2 else: if len(group_2) lt; 3: group_2.append(name) given_group = 2 else: group_1.append(name) given_group = 1 print("You are in group " str(given_group)) available_names.pop(available_names.index(name)) else: print("Name not available") if len(group_1) == 3 and len(group_2) == 3: break print(group_1) print(group_2) print("Finish")
Это не очень элегантный код, но я просто воспользуюсь оправданием, чтобы четко показать процесс :p
Комментарии:
1. Это точно ответило на мой вопрос, большое вам спасибо! Я не понимал логики, лежащей в основе «пока верно» в этом случае, но теперь я думаю, что понял это.
Ответ №2:
Если вы хотите заполнить обе группы одинаково, вам нужно выполнить цикл, пока вы не выделите все имена, и вам нужно проверить, когда одна группа «заполнена», чтобы вы могли переключиться на другую.
Поскольку вы хотите назначить все имена, проще удалить имена из набора доступных имен по мере их назначения и использовать это в качестве условия для цикла. Вы также можете упростить процесс выбора группы, поместив их в словарь, а не имея двух именованных переменных (что требует большого количества копирования вставки кода, чтобы сохранить правильность).
import random def get_group(): available_names = {"Tomás", "Fábio", "Rita", "Dany", "Inês", "Ana"} groups = {1: [], 2: []} while available_names: # Pick a name, requiring it to be one of the available names. name = input("Tell me your name: ") if name not in available_names: print("Name not available") print(f"Available names: {', '.join(available_names)}") continue # Randomly pick a group. # If it's already full (3 names), default to the other group. given_group = random.randint(1, 2) if len(groups[given_group]) gt;= 3: given_group = 3 - given_group # Assign to the given group, and make the name unavailable. groups[given_group].append(name) available_names.remove(name) print(f"You are in group {given_group}") print("Finish") get_group()
Комментарии:
1. Ух ты! Это такой умный и короткий способ сделать это. Мне бы никогда не пришло в голову сделать это вот так. Это действительно показывает мне, насколько важно быть кратким.
Ответ №3:
замените lt;=
на lt;
и замените and
на or
, чтобы проверить, есть ли в какой-либо группе по-прежнему менее 3 элементов. как только у обоих будет по 3 элемента loop
, они выйдут.
while len(group_1) lt; 3 or len(group_2) lt; 3: