Python ProjectEuler#35:测试偶数整数是否为';内部';整数

Python ProjectEuler#35:测试偶数整数是否为';内部';整数,python,Python,问:迭代一个整数并在其中查找其他整数的最佳方法是什么,如果该整数包含其他整数,则将其丢弃 长版本: 我一直在努力提高我的Python技能,试图为ProjectEuler中的问题提供有效的解决方案。在经历了大约20个问题之后,我发现虽然我能解决这些问题,但我的解决方案往往不雅观且笨拙(即丑陋且缓慢)。从问题的结构来看,我认为我需要学习一些更好的解决方案,因为更复杂的东西会加剧这些低效 不管怎样,今天我在做问题35,它要求所有的循环素数都在1000000以下。我已经列出了1000000以下的所有素数

问:迭代一个整数并在其中查找其他整数的最佳方法是什么,如果该整数包含其他整数,则将其丢弃

长版本:

我一直在努力提高我的Python技能,试图为ProjectEuler中的问题提供有效的解决方案。在经历了大约20个问题之后,我发现虽然我能解决这些问题,但我的解决方案往往不雅观且笨拙(即丑陋且缓慢)。从问题的结构来看,我认为我需要学习一些更好的解决方案,因为更复杂的东西会加剧这些低效

不管怎样,今天我在做问题35,它要求所有的循环素数都在1000000以下。我已经列出了1000000以下的所有素数,并建立了一个小框架,列出了下面这些素数的排列,我计划对每个素数进行测试:

def number_switcher(number):
  number = [num for num in str(number)]
  numlist = [''.join(num) for num in list(itertools.permutations(number))]
  return [int(num) for num in numlist]
在所有素数上运行此操作,然后测试每个可能的素数排列,正如您所想象的,这并不能解决问题

然后我想到,在我开始排列之前,我可以扔掉所有包含偶数的数字(假设它们超过一位数)或任何包含五的数字

这是我真正迷路的地方。尽管看起来很简单,但经过两天的尝试,我还是不知道如何扔掉任何含有偶数或5的多位数数字

以下是我尝试过的(假设1000000以下的所有素数列表称为“素数”):

然后我做了以下实验:

for prime in primes:
  if '0' in str(prime):
    primes.remove(prime)

>>>>len(primes)
4264
这把我的素数表减少了一半。好吧,也许我的思路是对的,我只需要一个难看的“如果str(prime)中的'0'或者str(prime)中的'2',”等等

但奇怪的是:当我检查我的“素数”列表时,它仍然有带“0”的素数。在新的素数列表上再次运行相同的操作,我得到以下结果:

 for prime in primes:
   if '0' in str(prime):
     primes.remove(prime)
>>>>len(primes)
4026
…结果再次下降到:

>>>>len(primes)
3892
....
3861 # again
....
3843 #and again
也许我在这里遗漏了一些明显的东西,但这似乎是第一个测试是否应该找到任何包含“0”的素数并删除所有素数

最后,我还尝试了以下方法,这看起来很可怕,因为它在火车轨道上毫无意义地来回跳跃,但它似乎必须工作:

for num in primes:
  for d in str(num):
    if (int(d) % 2 == 0 or int(d) == 5):
      primes.remove(num)   # doesn't work: ValueError: list.remove(x): x not in list 
    else:
      pass
我觉得我不应该为这个问题大发雷霆,但这让我有点疯狂,可能是因为我已经到了一个地步,我只是想找出一个解决方案,我的尝试越来越不清晰了

我的问题是:

对一个整数进行迭代并在其中找到其他整数的最佳方法是什么,如果它包含其他整数,那么就把这个愚蠢的整数扔掉

谢谢你的帮助/阅读

脚注:
这是我在这里问的第一个问题,但几个月来我一直受益于这个网站的指导。如果此问题/解决方案存在,我深表歉意,但我寻找了它,但找不到拼凑解决方案的方法。大多数搜索结果显示为“如何判断整数是否为偶数”。

@root是正确的,您关于如何优化整数的假设是错误的,但我认为指出您所做的工作在Python级别上不起作用是有用的

你的布尔问题

[num for num in primes if any(x for x in '024685' in str(num))] # failed: 'bool' object is not iterable
str(num)中的'024685'首先被求值,因此它等于True中x的
-这是不可能的。上述内容将写成:

[num for num in primes if not any(ch in '024685' for ch in str(num)]
[num for num in primes if not any(num % i == 0 for i in (2, 5)]
它从
str(num)
中提取每个字符,并检查它是否是
'024685'
中的一个

您的列表问题

[num for num in primes if any(x for x in '024685' in str(num))] # failed: 'bool' object is not iterable
这里有一条经验法则——不要修改你正在迭代的东西。如果您使用
dict
尝试此操作,您将抛出一个异常-但是对于
列表
来说,它可能会悄悄出错,但偶尔会中断

当从列表中删除多个值时,最好构建一个只保留所需值的新列表,例如:

no_zero = [num for num in primes if '0' not in str(num)]
如果你想修改原始素数:

primes[:] = no_zero
上一个示例也因
.remove()
而失败,将上述内容组合在一起可以写成:

[num for num in primes if not any(ch in '024685' for ch in str(num)]
[num for num in primes if not any(num % i == 0 for i in (2, 5)]
杂项

[num for num in primes if any(x for x in '024685' in str(num))] # failed: 'bool' object is not iterable

您可能希望考虑将素数存储在<代码>设置>代码>中,因为您不关心素数的顺序,并且将更快地进行成员资格测试。

< P>谢谢,Jon Clements。今天,我用以下脚本解决了这个问题(注意,我必须确保'024685'脱衣舞女没有脱掉'2'和'5',因为这是答案的一部分,这让我有一段时间不感兴趣……:

导入数学
进口itertools
def prime_测试(编号):
如果范围(2,int(math.sqrt(number))+1)中的x的all(number%x!=0):
返回真值
其他:
返回错误
def查找_素数(限制):
素数=[2]
对于范围内的x(3,极限+1,2):
如果素数检验(x):
素数追加(x)
其他:
通过
返回素数
def循环(编号):
circ_列表=[编号]
x=1
当x1)]
循环_素数=[]
对于非均衡中的素数:
如果循环中x的所有(初始试验(x)):
循环素数。追加(素数)
其他:
通过
返回循环素数,len(循环素数)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
打印(main())

另一件我没有意识到的事情是,我只是应该旋转数字,而不是提供所有可能的排列。当人们试图解决问题时,这些小把戏可能会把他们吓跑。

在这种情况下,他的优化实际上是正确的。Euler#35项目要求质数的每个排列