Словарь списков, которые включают все четные или нечетные комбинации чисел - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу создать словарь из всех четных или нечетных комбинаций целых чисел. Мой код до сих пор:

values = [[0,1,2],[0,1,2],[0,1,2]] 

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

print(combos)

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

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

печатаются все возможные комбинации: [0,0,0], [0,1,0], [0,2,0], [1,0,0] ... [2,2,2]

Я пытаюсь отбросить все результаты, которые не содержат ни всех нечетных, ни всех четных чисел.

Я бы хотел, чтобы оставшиеся результаты были в словаре (например, я хочу сохранить [ 0,0,0] и [0,2,0], но откажитесь [0,1,0])

Пока у меня есть эти идеи, но я не уверен, откуда go:

r=combos%2  #remainder after dividing everything by 2
keep= np.all(r==0) and np.all(r==1)

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Попробуйте это.

values = [[2,2,2],[0,1,2],[0,1,2],[3,3,3],[1,1,1]]
combo = []
for i in values:
        status = 0
        for x in i:
                if x%2 == 0:
        #               status = 0
        #               print(x%2)
                        pass
                else:
                        status += 1
        if status ==3:
                combo.append(i)
        if status ==0:
                combo.append(i)

print (combo)

вывод -

[[2, 2, 2], [3, 3, 3], [1, 1, 1]]
0 голосов
/ 03 апреля 2020

Я не совсем уверен, что вы подразумеваете под наличием оставшихся результатов в словаре, но в соответствии с вашим фрагментом кода вы, похоже, ищете логический массив, указывающий, какие строки вашего 2d-массива сохранить.

r = combos % 2

Это указывает для каждого отдельного числа в массиве, является ли оно нечетным или четным.

Чтобы получить индексы строк, которые нужно сохранить, необходимо рассмотреть два случая:

  1. Все числа в строке четные
  2. Все числа в строке нечетные

Использование np.all проверит весь массив, а не только текущий ряд. Поэтому вам нужно передать параметр axis=1, чтобы применить функцию не ко всему массиву, а только к столбцам.

Следовательно, чтобы проверить, не являются ли все записи в строке нечетными, вы можете сделать

r.all(axis=1)

Чтобы проверить, содержит ли строка только четные числа, ни один из оставшихся не может быть одним. Так что здесь вам нужно не np.all, а ~.np.any.

~r.any(axis=1)

Теперь, так как вы хотите, чтобы все строки были либо четными, либо нечетными, вы можете использовать логическое ИЛИ.

keep = r.all(axis=1) | ~r.any(axis=1)

Затем вы можете отфильтровать свой исходный массив следующим образом:

filtered = combos[keep]

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

Отредактировано: Если вы хотите иметь словарь с ключами «четный» и «нечетный», вы можете сделать это:

result_dict = {
    "odd": combos[r.all(axis=1)].tolist(),
    "even": combos[~r.any(axis=1)].tolist()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...