Протестируйте каждое расположение переменных без жесткого кодирования

#python #variables

#python #переменные

Вопрос:

У меня есть 9 разных переменных, мы будем называть их a — i, я хочу проверить, есть ли a b c == d e f amp; a b c == g h i amp; a b c == a d g amp; a b c == b e h amp; a b c == c f i amp; a b c == a e i amp; a b c == c e g . Но есть одна проблема. Я хочу протестировать все возможные варианты этого, такие как замена b и h или даже большего количества переменных. Я также подсчитал, что существует 45360 различных расположений. Мне интересно, есть ли какой-либо возможный способ сделать это… Я был бы признателен за любую помощь!

Комментарии:

1. Да, поместите ваши объекты в контейнер и используйте itertools или свой собственный алгоритм, чтобы получить нужные вам комбинации. Не используйте кучу переменных.

Ответ №1:

Вы можете использовать itertools.permutations для генерации списка всех перестановок, затем вы можете либо суммировать их, либо написать свою собственную функцию добавления:

 def add3(n1, n2, n3):
    return n1 n2 n3

list_of_nums = [a, b, c, d, e, f, g, h, i]
all_perm_sums = (add3(n1, n2, n3) for n1, n2, n3 in itertools.permutations(list_of_nums, 3))
all_perm_sums_are_equal = len(set(all_perm_sums)) == 1
  

Подсказка: будьте осторожны с плавающими точками, поскольку сложения с плавающей запятой не являются коммутативными, a b не обязательно равны b a , и они не ассоциативны, (a b) c не обязательно равны a (b c) . Это не должно быть проблемой, если все числа являются целыми числами.

Комментарии:

1. Это не совсем ответ на мой вопрос. Думаю, я сформулировал это немного неправильно. Если a = 2, b = 7, c = 6, d = 9, e = 5, f = 1, g = 4, h = 3, i = 8, оно должно возвращать значение true, потому что a b c == d e f amp; a b c == g h i amp; a b c == a d g amp; a b c == b e h amp; a b c == c f i amp; a b c == a e i amp; a b c == c e g , даже если a b d == c e f amp; a b d == g h i amp; a b d == a c g amp; a b d == b e h amp; a b d == d f i amp; a b d == a e i amp; a b d == d e g это не так. (Во второй системе уравнений я только поменял местами c с d)