Найти все возможные комбинации четных или нечетных чисел и выполнить математические операции над результатом - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь найти все возможные комбинации, взяв одно целое число из каждого из трех списков. Комбинации должны содержать либо все четные, либо все нечетные целые числа.

Затем я хотел бы найти сумму квадратов целых чисел в каждой комбинации.

Наконец, я хотел бы создать словарь, который использует это значение в качестве ключа и комбинацию, которую он использовал в качестве сохраненного значения.

Например, для комбинации (1,3,1): ключом будет целое число 11 (из суммы (1 ^ 2) + (3 ^ 2) + (1 ^ 2)), а сохраненное значение будет (1,3,1)

Мой код так far:

lists = [[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6]] 

combos = np.array([list(i) for i in np.array(np.meshgrid(*values)).T.reshape(-1,len(values))])

Это занимает три списка, каждый из которых содержит целые числа 0-6

и использует элемент из каждого списка, чтобы создать комбинацию из трех целых чисел

Все Результат возможных комбинаций: [0,0,0], [0,1,0], [0,2,0], [1,0,0] ... [6,6,6]

Ответы [ 3 ]

3 голосов
/ 06 апреля 2020

Одно решение.

Код

from itertools import product

lsts = [[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6]] 

# Product generates all combinations of taking one from each list
combos = product(*lsts)

# We filter for the combinations with all odd or even
# using generator i.e. () but could have been a list i.e. []
valid = (c for c in combos if all(x%2==0 for x in c) or all(x%2==1 for x in c))

# Dictionary key is sum of the squares of c
d = {sum(map(lambda i : i * i, c)) : c for c in valid}

# Pretty Print result
import pprint
pprint.pprint(d)

Выход

{0: (0, 0, 0),
 3: (1, 1, 1),
 4: (2, 0, 0),
 8: (2, 2, 0),
 11: (3, 1, 1),
 12: (2, 2, 2),
 16: (4, 0, 0),
 19: (3, 3, 1),
 20: (4, 2, 0),
 24: (4, 2, 2),
 27: (5, 1, 1),
 32: (4, 4, 0),
 35: (5, 3, 1),
 36: (6, 0, 0),
 40: (6, 2, 0),
 43: (5, 3, 3),
 44: (6, 2, 2),
 48: (4, 4, 4),
 51: (5, 5, 1),
 52: (6, 4, 0),
 56: (6, 4, 2),
 59: (5, 5, 3),
 68: (6, 4, 4),
 72: (6, 6, 0),
 75: (5, 5, 5),
 76: (6, 6, 2),
 88: (6, 6, 4),
 108: (6, 6, 6)}
2 голосов
/ 06 апреля 2020

Вы можете использовать Закон квадратичности c Взаимность для непосредственного перечисления последовательности равномерно нечетных / четных сумм целочисленных квадратов.

from itertools import combinations_with_replacement
{
  sum(x ** 2 for x in xs): xs
  for xs in combinations_with_replacement(range(7), r=3)
  if sum(x ** 2 for x in xs) % 8 in {3, 4, 0}
}

Youtube Channel " Mathologer "демонстрирует доказательство теоремы , которая объясняет, где модуль и остаток находятся путем разбиения" суммы 3 четных / нечетных целочисленных квадратов"на связные утверждения в модульной арифмети c.

2 голосов
/ 06 апреля 2020
from itertools import combinations_with_replacement as cwr

iter_list = [0,1,2,3,4,5,6]

evens = [
    [t[0], t[1], t[2]] 
    for t in list(cwr(iter_list, 3)) 
    if t[0] % 2 == 0 and t[1] % 2 == 0 and t[2] % 2 == 0
]

odds = [
    [t[0], t[1], t[2]] 
    for t in list(cwr(iter_list, 3))
    if t[0] % 2 != 0 and t[1] % 2 != 0 and t[2] % 2 != 0
]

evens_dict = {e[0] ** 2 + e[1] ** 2 + e[2] ** 2 : e for e in evens}

odds_dict = {o[0] ** 2 + o[1] ** 2 + o[2] ** 2 : o for o in odds}

final_dict = {}
final_dict.update(evens_dict)
final_dict.update(odds_dict)

final_dict

# if you need it sorted by keys, add this
#final_dict = {k : v for k, v in sorted(final_dict.items(), key = lambda v : v, reverse = False)}
#final_dict
...