Как проверить наличие повторяющихся элементов из списка и остановить цикл while?

#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: