【问题标题】:How can I check to see if a 4-digit number has a duplicate digit or not?如何检查 4 位数字是否有重复数字?
【发布时间】:2021-09-15 05:32:25
【问题描述】:

我目前正在编写 Aces Jumble Zilch 游戏。在这个游戏中,计算机应该生成一个没有重复数字的 4 位数字,用户需要弄清楚这个数字是什么。我的问题是,“我如何检查随机数中是否有重复的数字?例如,4444 有重复的数字,但 4321 没有。

【问题讨论】:

  • 嗨,布兰妮,欢迎来到 stackoverflow。你会发现这里的人对提问的方式很挑剔。您应该始终发布您迄今为止尝试过的内容。
  • 更好的方法是创建您的列表[1,2,3,4],然后使用random.shuffle 重新排列它们。这样的数字只有 24 个,因此生成一个低于 10,000 的随机数并检查它会非常浪费。

标签: python random numbers


【解决方案1】:

如果我理解正确,您想查看一个数字是否在 4 位整数中重复。

这是我对这个问题的幼稚解决方案。 我会从intlistset 中创建一个str 对象。 最后将setlenlistlen 进行比较。 要么它们的长度相同,要么存在重复的数字。

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

上面的函数返回一个重复的list。如果没有,那么它将是一个空列表。

我希望代码对您来说不会太冗长。我的意图是尽可能清晰,并忠于 Python 之禅的三首诗句。

此外,您可以随意使用这两个函数,将它们的返回值设为其他数据类型(例如,将副本转换回 int、控制流输出等,您的 RAM 是限制)。

【讨论】:

    【解决方案2】:

    您可以使用 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())
    

    【讨论】:

      【解决方案3】:

      如果您的目标只是检查四位数字是否唯一,您可以通过一个简单的函数来完成:

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

      这会将数字转换为字符串,然后转换为单个字符的列表,将它们放入一个集合(需要唯一性),然后检查该集合是否包含 4 个值。 您可以通过删除 4 的硬连线值并将目标位数作为参数传递来使其更通用,并适当检查它不能大于 10(或小于 1)。

      正如其他人所指出的,生成值以保证唯一性可能是一个更好的主意。

      【讨论】:

        【解决方案4】:

        最好的办法可能是draw 4 numbers without replacing 的范围包括 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 是“无需替换即可绘制” - 请参阅 docs
        • 可以使用简单的str.join(然后转换为int)在字符串中进行总结->参见num1
        • enumerating 得到的整数列表,并在求和前将每个数字乘以 1000、100、10、1 -> 参见 num2

        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]))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-04
          • 1970-01-01
          • 2011-11-27
          • 2011-01-02
          • 2021-01-12
          • 2015-04-17
          • 2021-01-03
          • 2012-11-19
          相关资源
          最近更新 更多