Как проверять значения между переменными?

#python

#python

Вопрос:

Необходимо проверить значения нескольких переменных на одинаковость.

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

 num1 = random.randint(1,10)
num2 = random.randint(1,10)
num3 = random.randint(1,10)
num4 = random.randint(1,10)

print(num1, num2, num3, num4)
  

я хотел бы, чтобы, если 2 из переменных совпадают, выводилось «Хорошая работа», или если 3 совпадают, это говорит что-то еще и так далее.

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

1. @gmds Я не вижу никаких массивов. Главный вопрос в том, есть ли у вас заранее определенное значение, с которым вам нужно сравнить все 4 переменных?

2. Упс, мой разум вставил np перед random .

3. Поместите ваши сообщения в список, а затем получите к ним доступ через их индекс с помощью вашего num - 1 .

4. Вместо генерации нескольких случайных чисел в отдельных переменных, можете ли вы собрать их в какой-нибудь итерируемый тип, такой как list ?

Ответ №1:

Используйте collections модуль; у него есть классы и методы для поддержки таких потребностей.

1-й, создайте цикл — в данном случае для понимания списка — для генерации вашего списка случайных чисел. 2-й, используйте Counter класс для подсчета ваших значений. Наконец, используйте most_common() для сортировки этих значений для упрощения анализа.

 import random
from collections import Counter

die_ct = 4
die_size = 10

# Gather all of your random numbers into a list
roll_all = [random.randint(1, die_size) for _ in range(die_ct)]
print("Die rolls", roll_all)

# Count the quantity of each value in the list
count_all = Counter(roll_all)
print("counts", count_all)

# Sort match counts for easy checking
match_sort = count_all.most_common()
print("matches", match_sort)
  

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

Ответ №2:

Это должно сделать:

 from numpy import random
num1 = random.randint(1,10)
num2 = random.randint(1,10)
num3 = random.randint(1,10)
num4 = random.randint(1,10)

res = len(set([num1, num2, num3, num4]))

out = {1: '4 equal values',2: '3 equal values',3: '2 equal values',4: 'no equal values'}

print(out[res])
  

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

1. Это неверно. [1, 1, 2, 2] и [1, 1, 1, 2] возвращают одно и то же значение 2 , которое вы помечаете как 3 равных значения.

2. Для использования set вам нужно было бы сделать res = roll_all.count(max(set(roll_all), key=roll_all.count)) . Не очень красиво.

Ответ №3:

попробуйте передать значения в set() и проверьте длину set

поскольку набор не может содержать дублирующихся значений, длина набора будет равна количеству разных значений

т. е.

 len(set([1,2,3,1,1])) = 3,

len(set([1,1,1,1,1])) = 1
  

и так далее

UPD:

если вам не нужно одинаковое количество групп, вы можете использовать groupby в itertools поверх списка чисел

что-то вроде этого:

 valdict = dict((k, len(list(g))) for k, g in groupby(sorted(numbers)))
  

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

1. Это неверно. [1, 1, 2, 2] и [1, 1, 1, 2] возвращают одно и то же значение 2, которое вы помечаете как 3 равных значения.