我对Python很陌生,很难在我的列表列表中计算我的等额金额 . 我创建了一个数字列表(列表一个),据Goldbach说,每个数字等于三个Primenumbers . 我现在有一个素数的所有组合的列表,现在我想计算列表oneven中的每个数字的组合数量,并打印出来 . 我尝试使用“导入集合”,由于我的代码不可以使用,因此无法正常工作 . 然后我累了一个数字添加到一个空列表,它上升到相等的总和,但我收到错误消息:
IndexError:列表赋值索引超出范围
这是我的代码,我正在努力:
lijst2 = []
lijst = []
for i in oneven:
for a in priemgetallen:
for b in priemgetallen:
if a >= b:
c = i - a - b
if c in priemgetallen and b >= c:
lijst.append([c,b,a])
for item in lijst:
if sum(item) in lijst2:
lijst2[sum(item)] = lijst2.get(sum(item))+1
else:
lijst2[sum(item)] = 1
for k,v in lijst2.items():
print(str(k)+':'+str(v))
lijst2 = set(lijst)
print(lijst2)
如果你对我想要做的事情感兴趣,我正在尝试为Goldbachs理论写一个计数器,所以这是我的整个代码:
oneven = []
for i in range(7,102,2):
oneven.append(i)
priemgetallen = [2]
counter = 3
while priemgetallen[-1] < oneven[-1]:
priemgetallendelers = []
for i in range (1,counter+1):
if counter % i == 0:
priemgetallendelers.append(i)
if len(priemgetallendelers) == 2:
priemgetallen.append(counter)
counter += 1
else:
counter +=1
lijst2 = []
lijst = []
for i in oneven:
for a in priemgetallen:
for b in priemgetallen:
if a >= b:
c = i - a - b
if c in priemgetallen and b >= c:
lijst.append([c,b,a])
for item in lijst:
if sum(item) in lijst2:
lijst2[sum(item)] = lijst2.get(sum(item))+1
else:
lijst2[sum(item)] = 1
for k,v in lijst2.items():
print(str(k)+':'+str(v))
lijst2 = set(lijst)
print(lijst2)
最后它应该看起来像这样:
7 = 2 + 2 + 3
9 = 2 + 2 + 5
= 3 + 3 + 3
11 = 2 + 2 + 7
= 3 + 3 + 5
13 = 3 + 3 + 7
= 3 + 5 + 5
Options to write: 7, 9, 11, ...:
1, 2, 2, 2, 3, 4, 3, 5, 5, 5, 7, 7, 6, 9, 8,
1 回答
有些地方你的代码效率很低 . 首先,如果你知道你需要的素数的上限,那么Sieve of Eratosthenes是一种更有效的方法来生成素数:
然后你的内部检查循环
if a >= b:
和if c in priemgetallen and b >= c:
非常低效 . 使用3个嵌套循环迭代质数更有效,得到求和并将其添加到相应的"bin" . 此外,通过记住"outer"迭代中的当前索引并从中开始,您可以通过删除检查和迭代次数来优化代码 . 唯一的技巧是过滤掉产生偶数的形式[2, odd_prime, odd_prime]
的三元组 . 恕我直言,最简单的方法就是为[2, 2, odd_prime]
三胞胎运行一个单独的循环 .goldbach(31)产生以下输出:
你也可以用
goldbach
中的goldbach
优化goldbach
中的goldbach
,以便只存储奇数索引(并不存储偶数的空列表),但我没有打扰 .