Извлечение данных из вложенных списков с исключением (Магия: Сбор данных), Python

#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? это то, как именно вы это написали, потому что в нем отсутствует идентификатор