Получить код, чтобы остановить добавление списка в другой список, если сумма уже существует

Я новичок в программировании в целом и пытаюсь сделать "Теорию Голдбаха" в 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)
Другие вопросы по тегам