#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 равных значения.