Python:创建一个包含所有不同数字的所有四位数字的列表

时间:2017-10-05 10:09:54

标签: python python-3.x

我想知道是否有更简单的方法来实现此代码实现的目标。现在代码在列表中创建所有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

9 个答案:

答案 0 :(得分:3)

这可以更容易表达。

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)

答案 1 :(得分:1)

我将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)调用此函数,然后获取包含所需数字的列表。

答案 2 :(得分:0)

你可以在一行中完成:

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

答案 3 :(得分:0)

使用递归可以轻松解决这些类型的问题。

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)

答案 4 :(得分:0)

尝试以下方法:

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

不应从此脚本外部调用以下划线(_为前缀)的函数。如果您希望将结果视为与字符串数组不同的结果(例如,一组int),则可以按如下方式更改_formatDigit()函数:

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

答案 5 :(得分:0)

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 :(得分:0)

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”。希望对您有所帮助。

答案 7 :(得分:0)

我尝试为绝对初学者写清楚^^当然,如果您使用组合和高级数组方法,则可以更快更短。<​​/ p>

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

答案 8 :(得分:0)

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

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