Перечисление и 2D-массивы в Python?

В настоящее время я работаю над кодом на Python, и у меня есть следующие перечисления:

#Enumeration - matter type
matterType = ['matter', 'antimatter']
enumMatterType = enumerate(matterType)

#Enumeration  - flavor
flavor = ['electron', 'mu', 'tau']
enumFlavor = enumerate(flavor)

Я также создал 2D-массив:

alpha = [[alpha_electron, alpha_anti_electron], 
        [alpha_mu, alpha_anti_mu], 
        [alpha_tau, alpha_anti_tau]]

Предполагается, что это массив констант, которые я определил ранее. Я использую эти константы в уравнении, но я ссылаюсь на них как на alpha[0][0] или alpha[0][1] и т. д. Мне кажется, что когда кто-то смотрит на мой код, они лучше понимают его, если бы у меня было что-то вроде alpha[matter][electron] или alpha[antimatter][electron]. Есть ли способ использовать перечисление из предыдущего для определения моих переменных из массива, подобного этому? Как вообще использовать перечисление с массивами? Как я могу записать свои альфа-значения с помощью перечисления? Пожалуйста, дайте мне знать, если какая-либо часть этого не имеет смысла - я буду рад уточнить.

alpha[matter][electron] был бы невозможен, потому что они должны были бы быть фиксированными значениями для matter и electron. Рассмотрим словарь с ключом кортежа?
roganjosh 08.09.2018 20:41

Думаю, вы ищете enum.IntEnum?

abarnert 08.09.2018 20:56

Это не массивы, это списки

juanpa.arrivillaga 08.09.2018 20:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
2 138
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам следует рассмотреть словарь с ключами кортежа:

matterType = ['matter', 'antimatter']
flavor = ['electron', 'mu', 'tau']

alpha = [['alpha_electron', 'alpha_anti_electron'], 
        ['alpha_mu', 'alpha_anti_mu'], 
        ['alpha_tau', 'alpha_anti_tau']]

ref_dict = {}
for x, pair_item in enumerate(flavor):
    for y, item in enumerate(matterType):
        ref_dict[(item, pair_item)] = alpha[x][y]

Теперь предположим, что я хочу "материя" и "му":

In[60]: ref_dict[('matter', 'mu')]
Out[60]: 'alpha_mu'

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

В вашем случае вам нужны константы перечисления с целочисленным значением, чтобы вы могли использовать их в качестве индексов в списке. Для этого вам понадобится IntEnum:

from enum import IntEnum

class MatterType(IntEnum):
    MATTER = 0
    ANTIMATTER = 1

class Flavor(IntEnum):
    ELECTRON = 0
    MU = 1
    TAU = 2

А теперь вместо этого:

alpha[0][0]

… Вы можете написать это:

alpha[MatterType.MATTER][Flavor.ELECTRON]

Другие вопросы по теме