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