【问题标题】:Python: Create a list of all four digits numbers with all different digits within itPython:创建一个包含所有不同数字的所有四位数字的列表
【发布时间】:2018-03-16 22:07:19
【问题描述】:

我想知道是否有更简单的方法来实现这段代码所要实现的目标。现在代码在列表中创建所有 4 位数字(如果数字以 0 开头,则不算作 4 位数字,例如 0123),并且数字中没有数字重复。因此,例如 1231 不在列表中。最好我想要一个代码来完成这个代码正在做的事情,但取决于在调用它时向函数提供的参数 N 会创建这种包含所有 N 位数字的列表。我希望这不是不可能理解的,因为我是编程新手。

def guessables():
   '''creates a list of all 4 digit numbers wherest every
    element has no repeating digits inside of that number+
    it doesn't count as a 4 digit number if it starts with a 0'''
     guesses=[]
     for a in range(1,10):
          for b in range(0,10):
               if a!=b:
                  for c in range(0,10):
                      if b!=c and a!=c:
                          for d in range(0,10):
                               if c!=d and d!=b and d!=a:
                                   guesses.append(str(a)+str(b)+str(c)+str(d))
    return guesses

【问题讨论】:

  • 你愿意做的是一个函数,它自己调用,每次加一个数字。

标签: python python-3.x


【解决方案1】:

这可以更容易地表达。

def all_digits_unique(number):
    # `set` will only record unique elements.
    # We convert to a string and check if the unique
    # elements are the same number as the original elements.
    return len(str(number)) == len(set(str(number)))

编辑:

def guesses(N):
    return filter(all_digits_unique, range(10**(N-1), 10**N))

print guesses(4)

【讨论】:

  • 这不能回答问题;它不会创建一个 4 位数的列表。
  • 我错过了一个要求 - 不能以零开头。 range 参数需要从更高开始 - range(10**(N-1), 10**N)
  • 仍然 - 运行代码以 738 个元素结束。 OP 要求 4 位数列表
  • range(1, 1000) 将创建一个包含 999 个项目的列表。 len(str(number) == len(set(str(number))) 评估数字长度是否相等。如果number == 1000,运行您的代码检查其中的数字是否唯一; len(number) 返回 4,len(set(number)) 返回 2,因为只有 1 和 0 是数字的一部分。
  • 你试过运行你的代码吗?您编辑的代码>>> print len(guesses(4)); --> 4536
【解决方案2】:

我会为此使用itertools,这是我认为最简单的通用答案:

import itertools

def guessables(num):
    guesses = []
    for p in itertools.permutations(xrange(10),num):
        if p[0] != 0:
            guesses.append(''.join(map(str, p))) 
    return guesses

只需使用guessables(4) 调用此函数并获取包含所有您想要的数字的列表。

【讨论】:

  • 此代码适用于大 n,与线程中投票最多的答案不同:)
【解决方案3】:

你可以一行完成:

print([str(a)+str(b)+str(c)+str(d) for a in range(1,10) for b in range(0,10) if a!=b for c in range(0,10) if b!=c and a!=c for d in range(0,10) if c!=d and d!=b and d!=a])

【讨论】:

    【解决方案4】:

    尝试以下方法:

    def guessables(n):
        ''' Returns an array with the combination of different digits of size "n" '''
        if n > 10:
            raise ValueError("The maximum number of different digits is 10.")
        elif n < 1:
            raise ValueError("The minimum number of digits is 1.")
        else:
            results = []
            for i in range(1, 10):
                _recursiveDigit([i], n, results)
            return results
    
    def _formatDigit(l):
        ''' Return a formated number from a list of its digits. '''
        return "".join(map(str, l))
    
    def _recursiveDigit(l, n, results):
        ''' Recursive function to calculate the following digit. '''
        if len(l) < n:
            for i in range(0, 10):
                if i not in l:
                    _recursiveDigit(l + [i], n, results)
        else:
            results.append(_formatDigit(l))
    

    不应从该脚本外部调用以下划线 (_) 为前缀的函数。如果您希望结果与字符串数组不同,例如整数数组,您可以更改 _formatDigit() 函数,如下所示:

    def _formatDigit(l):
        ''' Return a formated number from a list of its digits. '''
        return int("".join(map(str, l)))
    

    【讨论】:

      【解决方案5】:
      c=list(range(10))
      print c
      def fun(n,k,i,getnum):       # function , result in getnum
          if n==0:
              if k not in getnum and len(set(list(k)))==len(k) and k[0]!='0':
                  getnum.append(k)
              return
          if i>=len(c):
              return
          fun(n-1,k+str(c[i]),0,getnum)
          fun(n,k,i+1,getnum)
      
      getnum=[]
      d=fun(4,"",0,getnum)
      
      print getnum
      

      【讨论】:

        【解决方案6】:

        这些类型的问题很容易通过递归解决。

        def gen(num, n, saveto):
            if len(num) == 1 and num[0] == '0':
                return 
            if len(num) == n:
                saveto.append(int(''.join(num)))
                return 
        
            for i in range(0, 10):
                i= str(i)
                if i not in num:
                    gen(num+[i], n, saveto)
        
        saveto= []
        # generate 4 digit numbers
        gen([], 4, saveto)
        
        print(saveto)
        

        在这里,我使用列表num 通过在每次通话中放置一位数字来构造号码。当添加了四位数字时,它将数字存储到saveto 列表中。

        编辑:这是上述函数的一个版本,它返回数字列表而不是将它们附加到列表中。

        def gen(num, n):
            if len(num) == 1 and num[0] == '0':
                return []
            if len(num) == n:
                return [int(''.join(num))]
        
            ans = []
        
            for i in range(0, 10):
                i= str(i)
                if i not in num:
                    ans.extend(gen(num+[i], n))
        
            return ans
        
        saveto= gen([], 4)
        
        print(saveto)
        

        【讨论】:

        • 当您可以检查号码本身时,为什么要携带两个具有相同值的单独列表,一个用于号码,另一个用于黑名单?
        • 顺便说一句,他要求提供任何数字,您应该为此添加另一个参数。
        • 还有一个问题,为什么要这么早将它们转换为字符串?将它们保持为整数,直到结束。
        • 好点,我改变了我的代码。另外,我将数字作为字符串放入num 列表,否则我必须在使用连接之前这样做。这是我最初的方法,看起来有点乱。
        • 从算法中分离格式通常是一种很好的做法。与我的答案的另外两个不同之处是我保留了 OP 签名(返回列表而不是将一个作为“参考”传递(我知道 Python 不会作为参考/值传递))并且我对递归部分使用了单独的函数,因为我正在以不同的方式处理以“0”开头的特殊情况,但我们的答案非常相似。
        【解决方案7】:
        numPool = []
        
        for i in range(0, 10):
            for j in range(0, 10):
                for k in range(0,10):
                    for l in range(0,10):
                        if i != j and i != k and i != l and j != k and j != l and k != l :
                            numPool.append(str(i) + str(j) + str(k) + str(l))
        

        这可行,但请记住,这也会将“0123”或“0234”添加到列表中。如果您不想要以零开头的数字,您可能需要在 if 查询中添加“i != 0”。希望对您有所帮助。

        【讨论】:

          【解决方案8】:

          我尽量为初学者写清楚^^当然,如果您使用组合和高级数组方法,可以使其更快更短。

          def f(n)
              s = list(range(10**(n-1), 10**n))
              number_list = []
              for ss in s:
                  test_list = []
                  a = ss
                  while ss:
                      if ss % 10 in test_list:
                          break
                      test_list.append(ss % 10)
                      ss = ss // 10
                      if len(test_list) == n:
                          number_list.append(a)
              return number_list
          
          
          print(f(4))
          

          【讨论】:

            【解决方案9】:

            这将解决问题,无需重复数字:

            from itertools import permutations
            myperm = permutations([0,1,2,3,4,5,6,7,8,9],4)
            for digits in list(myperm):
                print(digits)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-12-08
              • 1970-01-01
              • 2020-07-16
              • 2013-05-01
              • 2021-03-26
              • 2014-06-06
              • 2021-07-02
              • 1970-01-01
              相关资源
              最近更新 更多