问题:迭代一个整数并在其中找到其他整数,然后如果该整数包含它们,则将其丢弃的最佳方法是什么?
长版:
我一直在努力提高我的 Python 技能,尝试为 Project Euler 的问题提供有效的解决方案。在经历了大约 20 个问题后,我发现虽然我可以解决这些问题,但我的解决方案通常是不优雅和笨拙的(即丑陋和缓慢)。问题的结构方式,我认为我需要学习一些更好的解决方案,因为更复杂的东西会加剧这些低效率。
无论如何,今天我正在处理问题 35,它要求所有小于 1,000,000 的圆素数。我已经制作了一个低于 1,000,000 的所有素数的列表,并且我构建了一个小框架来吐出下面这些素数的排列,我计划为每个排列测试素数:
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 的多位数字。
这是我尝试过的(假设所有低于 1,000,000 的素数列表称为“素数”):
[num for num in primes if any(x for x in '024685' in str(num))] # failed: 'bool' object is not iterable
然后我尝试了以下方法:
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
也许我在这里遗漏了一些明显的东西,但似乎第一个 if-test 应该找到任何带有“0”的素数并删除它们?
最后,我还尝试了以下方法,这看起来很糟糕,因为它毫无意义地在 str-integer 火车轨道上来回跳跃,但它似乎只是必须工作:
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
我觉得我不应该在这个问题上扯出我的头发,但这让我有点疯狂,可能是因为我已经到了我只是想找出一个解决方案的地步,我的尝试越来越少清醒。
这是我的问题:
迭代一个整数并在其中找到其他整数,然后将那个愚蠢的整数扔掉(如果它包含它们)的最佳方法是什么?
感谢您的帮助/阅读。
脚注:这是我在这里提出的第一个问题,但几个月来我已经从这个网站的指导中受益。如果这个问题/解决方案存在,我深表歉意,但我寻找它并找不到一种方法来拼凑解决方案。大多数搜索结果显示为“如何判断整数是否为偶数”。