Получить код, чтобы остановить добавление списка в другой список, если сумма уже существует
Я новичок в программировании в целом и пытаюсь сделать "Теорию Голдбаха" в Python, что каждое число от 3 до данного числа (в моем случае 50).
lijst2 = []
for n in lijst:
j = 2*n+1
lijst2.append(j)
priemgetallen = [2]
counter = 2
x = 2
while len(priemgetallen)<50:
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
Приведенный выше код не важен для моей проблемы и предназначен только для того, чтобы было легче понять, что я пытаюсь сделать.
while not len(sommen) == len(lijst2):
for i in lijst2:
for j in priemgetallen:
for r in priemgetallen:
for t in priemgetallen:
if i == j+r+t:
Здесь я пытаюсь сказать, что если число в моем исходном списке состоит из суммы трех простых чисел, добавьте его в список.
sommen2 = []
sommen2.append(j)
sommen2.append(r)
sommen2.append(t)
Так что до тех пор пока все не заработает, но если я позволю распечатать вывод, я получу несколько раз одно и то же "я" или, вернее, одну и ту же сумму от простых чисел.
for q in sommen:
if not sum(sommen2) == sum(q):
sommen.append(sommen2)
Здесь я пытаюсь сказать, что для aq в моем списке "sommen", если сумма этого q уже существует, не добавляйте еще одну. Но вместо этого мой ноутбук просто рассчитывает на долгое время.
print (sommen)
3 ответа
Проблема в вашей петле. Вы возвращаете одни и те же суммы более одного раза, потому что ваш цикл обрабатывает [1, 7, 5]
как отличается от [5, 7, 1]
как отличается от [7, 5, 1]
и так далее.
Очистите петлю, чтобы быть этим.
import itertools
l = [10, 15, 4, 2, 7, 20]
p = [1, 2, 3, 5, 7, 11, 13]
sommen = []
for v in map(lambda x: sum(x), itertools.combinations(p, 3)):
if v in sommen:
pass
elif v in l:
sommen.append(v)
print sommen
>> [10, 15, 20]
Как и ожидалось
2 + 3 + 5 = 10
3 + 5 + 7 = 15
2 + 7 + 11 = 20
Обратите внимание, что 1 + 2 + 7 также дает 10, но 10 не был добавлен дважды
Обратите внимание, что 2 + 5 + 13 также дает 20, но 20 не был добавлен дважды
Редактировать: Если вы хотите увидеть факторы, которые пошли как насчет этого:
for combo in itertools.combinations(p, 3):
if sum(combo) in map(lambda x: x[0],sommen):
pass
elif sum(combo) in l:
sommen.append([sum(combo), combo])
print sommen
>> [[10, (1, 2, 7)], [15, (1, 3, 11)], [20, (2, 5, 13)]]
Чтобы ответить на ваш оригинальный вопрос сначала:
Проблема заключается в том, что вы повторили весь sommen
при проверке только одного предмета sommen2
, предполагать sommen
содержит 9 значений, включая одно, равное sommen2
Сумма, вы все еще добавляете sommen2
в 8 раз.
Я бы использовал dict для комплексного переписывания вашей программы, например так:
sum_summands = dict()
# found a candidate i=j+r+t here
sum_summands[i] = (j,r,t) #use tuple not list
# or if you want to always keep the first candidate you've found
if i not in sum_summands: # don't overwrite if sum i already exists
sum_summands[i] = (j,r,t)
Есть множество других вещей, которые вы можете оптимизировать в своем алгоритме. Позвольте мне указать на наиболее очевидный. Вместо этого -
for i in lijst2:
for j in priemgetallen:
for r in priemgetallen:
for t in priemgetallen:
if i == j+r+t:
почему бы тебе не избавиться от самой внутренней петли -
for i in lijst2:
for j in priemgetallen:
for r in priemgetallen:
if i-j-r in priemgetallen:
Бессмысленно перебирать огромный список чисел просто для того, чтобы проверить, составляют ли они определенную сумму - вам нужно сделать какой-то минимальный уровень математики, чтобы упростить вещи.
Проблема заключается в следующем коде:
for q in sommen:
if not sum(sommen2) == sum(q):
sommen.append(sommen2)
Если я вас правильно понимаю, вы хотите добавить sommen2 к sommen, если его сумма еще не указана в sommen. Но то, что вы делаете, вы добавляете его в sommen для каждого элемента в sommen, у которого сумма не равна сумме sommen2. Замените это следующим:
if not any(sum(sommen2) == sum(q) for q in sommen):
sommen.append(sommen2)