#python #arrays #pandas #dictionary #indexing
Вопрос:
Новичок в Python. Этот вопрос зависит от MTGTools
пакета, расположенного здесь.
Фоновая магия: Сбор-это карточная игра, в которой определенные типы карт (существ) имеют атрибут «Сила».
Используя пакет MTGTools
, легко загрузить данные карты, а затем получить доступ к мощности карты с помощью этого синтаксиса:
PCardList.creatures().cards.data[0].power_num
PCardList
это список PCards
, которые «[являются] простым постоянным классом данных, представляющим Magic: карты сбора с их характерными атрибутами».
creatures()
фильтрует список существ (которые являются единственными картами с «силой»).
cards.data[0].power_num
возвращает числовое значение первого существа в PCardlist
, поэтому «power_num» является атрибутом PCard
индексируемого by cards.data[0]
.
Однако недавно разработчики начали печатать многоликие карты. Значения «мощности» для каждого лица содержатся в словаре, который является атрибутом PCard
. Итак, чтобы получить доступ к мощности лицевой стороны карты, мы используем следующий синтаксис:
PCardList.creatures().cards.data[0].card_faces[0].get('power_num')
Если карта имеет только одну грань, card_faces
это {NoneType}, но если она двусторонняя, то это список из двух словарей, где доступ к «силе» осуществляется get('power_num')
Проблема
Я пытаюсь составить список мощности каждой карты в a PCardList
. Понимание следующего списка идеально подходит для одноликих карт:
[PCardList.creatures().cards.data[i].power_num for i in range(0,len(PCardList.creatures()))]
Однако, если PCardList
он содержит многослойную карту, он вернет что-то вроде: [1.0, 2.0, None, 1.0, 3.0]
.
Что я хотел бы, так это создать средство проверки того, является ли PCard
оно многослойным, и если да, верните «силу» каждой грани в качестве отдельной записи в списке. Поэтому, если бы наша многослойная карта в приведенном выше примере имела мощность = 5,0 спереди и мощность = 0,0 сзади, наш новый список был бы следующим: [1.0, 2.0, 5.0, 0.0, 1.0, 3.0]
.
Попытка
pow_list = []
for x in PCardList.creatures().cards.data:
if x.card_faces is None:
pow_list.append(x.power_num)
else:
pow_list.append(x.card_faces[0].get('power_num')) #add first face
pow_list.append(x.card_faces[1].get('power_num')) #add second face
Это приводит к недопустимой синтаксической ошибке в строке «если».
Опять же, я новичок в Python, поэтому я не уверен в синтаксисе проверки того, является ли «нетип» истинным или есть лучший способ подойти к проблеме.
Если у кого-нибудь есть какие-либо советы о том, как подойти к этому, я был бы очень признателен.
ИЗМЕНИТЬ: Изменена проверка на is None
и keys()
на get()
. Новая ошибка заключается в
pow_list.append(x.card_faces[0].get('power_num')
^
Ошибка синтаксиса: неверный синтаксис
Комментарии:
1. Незначительная опечатка.
if x.card_faces = None:
так и должно бытьif x.card_faces == None:
.=
является назначением,==
предназначено для проверки на равенство. Кроме того, измените== None
наis None
, такNone
как это одноэлементный объект (хотя последнее предложение является скорее лучшей практикой).2. Это было много написано из-за небольшой опечатки. Спасибо за быстрый ответ. Я рад, что мой подход оказался верным.
3. Правильно ли отформатирован код в блоке for/if/else? это то, как именно вы это написали, потому что в нем отсутствует идентификатор