Условие (a * a + b * b = c * c) удовлетворяет в списке с использованием Python - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно знать, удовлетворяет ли элементы в списке условию a*a + b*b = c*c, где a, b и c - какие-либо элементы в следующем списке:

original_list =[8,5,73,3,34,4,23,73]

Математически, 3*3 + 4*4 = 5*5, но не уверен, как просмотреть список в python, чтобы удовлетворить это условие.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Код Python

[(a,b,c) for a in original_list for b in original_list for c in original_list if a*a+b*b==c*c]

Выход:

[(3, 4, 5), (4, 3, 5)]
0 голосов
/ 01 июня 2018

Этот вопрос вращается больше вокруг математики и алгоритмов, чем питонизмов.Решение, которое я предлагаю ниже, имеет сложность в O(n**2).

Идея состоит в том, чтобы обратить функцию (x, y) => x * x + y * y, где пространство поиска является перекрестным произведениемОригинальный список с собой.Затем, используя операторы множеств Python, вычислите пересечение между изображением приложения и допустимыми квадратами.В конце концов, используйте обратное приложение для восстановления триплетов.

from collections import defaultdict

original_list = [8, 5, 73, 3, 34, 4, 23, 73]
uniq = sorted(set(original_list))

antecedents = defaultdict(lambda: []) # Reverse mapping
for i, left in enumerate(uniq):
    for right in uniq[i+1:]:
        key = left * left + right * right
        antecedents[key].append((left, right))
# The keys of antecedents are sum of squares

uniq_squares = set([ x * x for x in uniq ])
common_keys = uniq_squares & antecedents.keys()

for key in common_keys:
    sqrt = int(0.5 + key**0.5)
    key_antecedents = antecedents[key]
    for (left, right) in key_antecedents:
        print("Found triplet:", (left, right, sqrt))
0 голосов
/ 01 июня 2018

Вы можете перебирать элементы из вашего списка, используя itertools.combinations:

import itertools

for a, b, c in itertools.combinations(sorted(original_list), 3):
    if a*a + b*b == c*c:
        print("Pythagorean triple found:", a, b, c) # or whaver...

Обратите внимание, что я сортирую исходный список перед передачей его в combinations.Это гарантирует, что a <= b <= c.Хотя нас не волнует относительный порядок a и b, но тот факт, что c не меньше, чем любой из них, является необходимым условием для теста, который вы проводите.

...