Как я могу проверить, есть ли у 4-значного номера дубликат цифры или нет?

#python #random #numbers

Вопрос:

В настоящее время я кодирую игру «Тузы в мешанине». В этой игре компьютер должен сгенерировать 4-значное число без повторяющихся цифр, и пользователю нужно выяснить, что это за число. Мой вопрос: «Как мне проверить, есть ли в случайном числе повторяющаяся цифра? Например, 4444 содержит повторяющиеся цифры, а 4321-нет.

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

1. Привет, Бритни, и добро пожаловать в stackoverflow. Вы обнаружите, что люди здесь очень разборчивы в том, как задаются вопросы. Вы всегда должны публиковать то, что вы пробовали до сих пор.

2. Лучшим способом было бы создать свой список [1,2,3,4] , а затем использовать random.shuffle его для их перестановки. Таких чисел всего 24, поэтому генерировать случайное число меньше 10 000 и проверять его было бы ужасно расточительно.

Ответ №1:

Вероятно, лучше всего сделать это, чтобы нарисовать 4 числа без замены из диапазона от 0 до 9 включительно.

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

 from random import sample 

num1 = int(''.join(sample("0123456789", k=4))))

num2 = sum(10**k*v for k,v in enumerate(sample(range(10), k=4)))
 

и то, и другое решило бы эту проблему.

  • sample является ли «ничья без замены» — см. документы
  • подведение итогов можно выполнить в строках с помощью простого соединения str. (а затем преобразовать в int) -> см. num1
  • или путем перечисления полученного списка целых чисел и умножения каждой цифры на 1000, 100, 10, 1 перед суммированием -> см. num2

A random.shuffle() также было бы возможно, но требуется больше строк кода, так как перетасовка выполняется на месте и возвращает None :

 from random import shuffle
data = [0,1,2,3,4,5,6,7,8,9]
shuffle(data) 
n = sum(10**k*v for k,v in enumerate(data[:4]))
 

Ответ №2:

Если ваша цель-просто проверить, уникальны ли четыре цифры, вы можете сделать это с помощью простой функции:

 def uniq4(num):
    return len(set(list(str(num)))) == 4
 

Это преобразует число в строку, затем в список отдельных символов, помещает их в набор (что требует уникальности), затем проверяет, содержит ли набор 4 значения.
Вы могли бы сделать это более общим, удалив жесткое значение 4 и передав целевое количество цифр в качестве аргумента с соответствующей проверкой, что оно не может быть больше 10 (или меньше 1).

Как отмечали другие, возможно, было бы лучше создать значения, гарантирующие уникальность.

Ответ №3:

Вы можете использовать тип данных Python, чтобы помочь вам очень простым способом.

  1. Вы преобразуете свой номер в строку
  2. Вы создаете набор с каждым символом вашей строки (наборы не допускают дублирования значений).
  3. Вы проверяете, равна ли длина вашего набора 4, если это правда, у вас есть 4 разных числа! Поздравляю!

Вы можете быть сбиты с толку, но, как и многие вещи на python, это очень просто. Посмотри

 import random
n = random.randint(1000,9999)
print(n)
if len(set(str(n))) == 4:
    print(True)
else:
    print(False)
 

Если вы хотите убедиться, что ваш код всегда содержит номер без дубликатов, вы можете исправить def это следующим образом.

 import random
def number_without_duplicates():
    n = random.randint(1000,9999)
    while len(set(str(n))) != 4:
        n = random.randint(1000,9999)
    return(n)

# to try it
for n in range(10):
    print(number_without_duplicates())
 

Ответ №4:

Если я правильно понял, вы хотите увидеть, повторяется ли цифра в 4-значном целочисленном числе.

Это мое наивное решение этой проблемы. Я бы создал str объект из int list этого , а затем set из него. Наконец, сравните то len из того set с тем len из того list . Либо они имеют одинаковую длину, либо есть какая-то повторяющаяся цифра.

 def distinct_digits(number):

    digits_string = str(number)
    digits_list = list(digits_string)   #You can't list() an int
    digits_set = set(digits_list)  #This datatype gets rid of duplicates

    return digit_set == digit_list #Think bool() the equality

 

Приведенная выше функция возвращает True , если все цифры различны, и False в противном случае.

Теперь, если вы хотите узнать, какая цифра повторяется. Я могу придумать эту наивную реализацию :

 def find_repeating_digit(number):

    digits_string = str(number)
    digits_list = list(digits_string)
    
    buffer_list = [] #First digit will go here, afterwards the comparison begins
    duplicates_list = [] #If there's any duplicate digit, it will go here

    for digit in digits_list:
       if digit in buffer_list: #Is digit already in buffer list?
           duplicates_list.append(digit) #Yes, so off to duplicates_list with it
       else: #Otherwise keep on appending digits to the buffer
           buffer_list.append(digit)

    return duplicates_list
 

Приведенная выше функция возвращает a list дубликатов. Если их нет, то это будет пустой список.

Я надеюсь, что код не слишком многословен для вас. Мое намерение состоит в том, чтобы быть как можно более ясным и оставаться верным трем стихам Дзен Питона.

Кроме того, не стесняйтесь играть с этими двумя функциями, возвращайте им значения других типов данных (например, Преобразуйте дубликат обратно в int, Контролируйте поток вывода и т. Д., Ваша оперативная память-это предел).