我被告知要解决一个问题,我必须找出全部由奇数组成的4位数字。我尝试了以下python代码:
new_list =[] # A list which holds the numbers
for a in range(1111,10000):
for b in str(a):
if int(b) % 2 == 1:
new_list.append(a)
print len(new_list)
然而,它在第二个循环的if语句中有一个缺陷,它只检查当前数字是否为奇数并且还导致数字被多次添加,更不用说它们不符合标准。那么如何使用python解决这个问题呢?如果你能编写一个函数来检查列表(参数)的所有数字是否都由只包含奇数/偶数的数字组成,那么它也会很棒。
编辑:我还需要一个数字列表,这就是为什么乘法不能完成所有工作。
答案 0 :(得分:5)
仅由奇数位组成的4位数字只能使用数字1
,3
,5
,7
和9
。这给你5的功率4是625个不同的数字。这并不需要全力以赴。
当然,您仍然可以使用itertools.product()
来执行此操作:
from itertools import product
print sum(1 for combo in product('13579', repeat=4))
因为product('13579', repeat=4)
将产生奇数位字符串中4个字符的所有可能组合。
您的代码需要测试所有数字是否为奇数;如果任何数字不奇数,则提前爆发:
new_list =[] # A list which holds the numbers
for a in range(1111,10000):
for b in str(a):
if int(b) % 2 == 0:
break
else:
# only executed if the loop wasn't broken out of
new_list.append(a)
您也可以将all()
函数与该测试的生成器表达式一起使用:
new_list = []
for a in range(1111,10000):
if all(int(b) % 2 == 1 for b in str(a)):
new_list.append(a)
然后可以折叠成列表理解:
new_list = [a for a in range(1111,10000) if all(int(b) % 2 == 1 for b in str(a))]
答案 1 :(得分:0)
我相信如果你想要模拟你已有的东西,这样的东西会起作用,但我回应了yotommy的观点,即一些直观的乘法可以解决问题。
for a in range(1111,10000):
allOdd = True
for b in str(a):
if int(b) % 2 == 0:
allOdd = False
if(allOdd):
new_list.append(a)
答案 2 :(得分:-1)
您可以尝试这样的事情
def isAllOdd(num):
if num < 10: return num % 2 == 1;
return isAllOdd(num % 10) and isAllOdd(int(num / 10))
答案 3 :(得分:-1)
for i in range(1000,3001):
s=str(i)
if (int(s[0])%2==0 and int(s[1])%2==0 and int(s[2])%2==0 and int(s[3])%2==0):
print(i,end=",")