Python: скрытие значений пустых ключей json с помощью f-строки

Я улучшил свою первую программу на Python, используя f-строки вместо print:

....
js = json.loads(data)

# here is an excerpt of my code:

def publi(type):
    if type == 'ART':
        return f"{nom} ({dat}). {tit}. {jou}. Pubmed: {pbm}"

print("Journal articles:")
for art in js['response']['docs']:
   stuff = art['docType_s']
   if not stuff == 'ART': continue
   tit = art['title_s'][0]
   nom = art['authFullName_s'][0]
   jou = art['journalTitle_s']
   dat = art['producedDateY_i']
   try:
       pbm = art['pubmedId_s']
   except (KeyError, NameError):
       pbm = ""
   print(publi('ART'))

Эта программа извлекает данные через файлы json для создания научных ссылок:

# sample output: J A. Anderson (2018). Looking at the DNA structure, Nature. PubMed: 3256988

Это работает хорошо, за исключением того, что (опять же) я не знаю, как скрыть значения ключей из оператора return, когда ключи не имеют значения (т. Е. В файле json такого ключа нет для одной конкретной цитаты).

Например, некоторые из научных цитат не имеют ключа / значения "Pubmed" (pmd). Вместо того, чтобы печатать "Pubmed: " с пустым значением, я хотел бы избавиться от них обоих:

# Desired output (when pbm key is missing from the JSON file):
# J A. Anderson (2018) Looking at the DNA structure, Nature
# NOT: J A. Anderson (2018) Looking at the DNA structure, Nature. Pubmed: 

Используя оператор print в функции publi, я мог бы написать следующее:

# Pubmed: ' if len(pbm)!=0 else "", pbm if len(pbm)!=0 else ""

Кто-нибудь знает, как получить такой же результат, используя f-строку?

Спасибо за вашу помощь.

PS: Как начинающий Python, я не смог бы решить эту конкретную проблему, просто читая пост Использование F-строки с форматом в зависимости от условия

2 ответа

Решение

Вы также можете использовать условное выражение в f-строке:

return f"{nom} {'(%s)' % dat if dat else ''}. {tit}. {jou}. {'Pubmed: ' + pbm if pbm else ''}"

или вы можете просто использовать and оператор:

return f"{nom} {dat and '(%s)' % dat}. {tit}. {jou}. {pbm and 'Pubmed: ' + pbm}"

Простой, но немного неуклюжий обходной путь - иметь декорации форматирования в строке.

try:
    pbm = ". Pubmed: " + art['pubmedId_s']
except (KeyError, NameError):
    pbm = ""
...
print(f"{nom} ({dat}). {tit}. {jou}{pbm}")
Другие вопросы по тегам