2016-03-02 2 views
0

Я пытаюсь написать код, чтобы проверить, является ли число суммой любых двух чисел в списке/словаре, и если номер найден, он перестает работать. Тем не менее, я сталкиваюсь с некоторыми ошибками. Может быть, моя логика не так, но вот мой код:Python найти сумму двух чисел из списка

a = [1,2,3,4,5,6,7,8,9] 

randomNumber = 8 

print len(a) 
length_of_a = len(a) 
for first in range(0,length_of_a -1): 
    aa = a 
    bb = a 
    del bb[first] 
    length_of_b = len(bb) 
    print bb, length_of_b 
    for second in range(0, length_of_b-1): 
     print aa[first], bb[second] 
     x = aa[first] + bb[second] 
     print x 
     if x == randomNumber: 
      print "Sum Found!" 
      break 
     else: 
      print "No Sum" 

Так что мои ошибки:

  • аа [первый] не запускается 1
  • мой второй массив хранит все меньше, когда размер должен всегда 8. Таким образом, давая мне ошибку «IndexError: индексный список из диапазона»
  • он не останавливается, когда он находит сумму,

Любая помощь будет отличной

+0

Кстати, я не знаю, есть ли другой способ, чтобы удалить номер из вне список кроме того del bb [первый]. Если есть другой способ, дайте мне знать –

+1

Возможный дубликат [Неожиданное поведение списка в Python] (http://stackoverflow.com/questions/21537078/unexpected-list-behavior-in-python) –

+1

Я не полностью конечно, что вы пытаетесь сделать, и у вас могут быть другие проблемы, но в достаточной степени ваш вопрос сводится к неправильному копированию списков, которые, как я считаю, сейчас дублируются. –

ответ

3

Существует очень простой способ сделать то, что вы хотите. Это одна линия, так что вы можете определить его с помощью lambda функции:

is_sum = lambda seq, x: any(x == y + z for yi, y in enumerate(seq) for zi, z in enumerate(seq) if zi != yi) 

использовать:

>>> is_sum([1, 2, 3, 4], 5) 
True 
>>> is_sum([1, 2, 3, 4], 6) 
True 
>>> is_sum([1, 2, 3, 4], 12) 
False 
+1

Это, к сожалению, покончит с моим любимым битом кода, который писал OP: 'randomNumber = 8' –

+0

О, вау! Это делает мой код намного проще писать! Спасибо! –

+0

Также важно отметить, что 'any()' вернет 'True', как только оно достигнет условия. Это как-то похоже на цикл и разрыв, как только ответ будет найден. Следовательно, это так же эффективно, как вы можете получить (я думал о «наборе» членства в качестве альтернативного, хотя и медленного решения, но я пройду ...) –

Смежные вопросы