2013-09-16 5 views
0

У меня есть список целых чисел и вход x. Я должен найти, есть ли в моем списке два числа, так что сумма их квадрата равна x.Сопрячь все элементы в списке

Я сделал это с помощью:

def findsquare(n1, n2, inp): 
    result = n1*n1 + n2*n2 

    if result == inp: 
     return True 

a = [2, -4, 6, 3, 9, 0 , -1, -9] 

x = 45 

i = 0 
while i < (len(a)-1): 
    res = findsquare(a[i], a[i+1], x) 

    if res: 
     print "Match: " + str(a[i]) + ", " + str(a[i+1]) 

    else: 
     print "No Match: " + str(a[i]) + ", " + str(a[i+1]) 

    i = i+1 

Проблемы с этим является элемент только по сравнению с его следующим элементом. Например, сравниваются 2 and -4, сравниваются -4 and 6. Я хочу, чтобы он сравнивал 2 с каждым элементом в списке, сравнивал -4 с любыми другими элементами в списке и так далее. Я хотел бы сделать это, не используя встроенную функцию в python.

ответ

2

Вам просто нужно отслеживать два индекса, потому что вы просматриваете список несколько раз. Если i отслеживает первый элемент вашего сравнения, вы должны иметь еще один j, который отслеживает второй элемент в вашем сравнении. Теперь j может быть любой другой индекс списка, но если вы хотите сделать все сравнения только один раз, вы можете начать в i+1:

for i in range(len(a)): 
    for j in range(i + 1, len(a)): 
     # compare the elements here 
     print(a[i], a[j]) 
+0

Да, это он. Спасибо чувак. Ценить это! – pynovice

1

Использование itertools.combination для генерации всех пар, например,

import itertools 

a = [2, -4, 6, 3, 9, 0 , -1, -9] 

for i in itertools.combinations(a, 2): 
    print i 

выход:

(2, -4) 
(2, 6) 
(2, 3) 
(2, 9) 
(2, 0) 
(2, -1) 
(2, -9) 
(-4, 6) 
(-4, 3) 
(-4, 9) 
(-4, 0) 
(-4, -1) 
(-4, -9) 
... 

itertools.combination эквивалентно:

def combinations(iterable, r): 
    # combinations('ABCD', 2) --> AB AC AD BC BD CD 
    # combinations(range(4), 3) --> 012 013 023 123 
    pool = tuple(iterable) 
    n = len(pool) 
    if r > n: 
     return 
    indices = range(r) 
    yield tuple(pool[i] for i in indices) 
    while True: 
     for i in reversed(range(r)): 
      if indices[i] != i + n - r: 
       break 
     else: 
      return 
     indices[i] += 1 
     for j in range(i+1, r): 
      indices[j] = indices[j-1] + 1 
     yield tuple(pool[i] for i in indices) 
1

мне довелось использовать их, когда я видел ваш вопрос:

def choose_two (L): 
    for i in xrange(len(L)): 
     for ii in xrange(i+1,len(L)): 
      yield (L[i],L[ii]) 

def xprod (L1,L2): 
    for l in L1: 
     for l2 in L2: 
      yield (l,l2) 

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

a = [2, -4, 6, 3, 9, 0 , -1, -9] 

x = 45 

is_in = x in [a1**2+a2**2 for (a1,a2) in choose_two(a)] 
1
>>> a=[2,1,2,5,6,7,8] 
>>> x=9 

def check(a,x): 
...  for p,v in enumerate(a): 
...    for k in range(p+1,len(a)): 
...      val=v+a[k] 
...      if val==x: 
...        print 'matched',v,a[k],x 
check(a,x) 
Смежные вопросы