Как ввести значения для dict на основе условия, встречающегося во вложенных dict? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь экспортировать некоторые данные из следующих json: http://app.parlamento.pt/webutils/docs/doc.txt?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e52766379394a626d6c6a6157463061585a686379394a53556b6c4d6a424d5a57647063327868644856795953394a626d6c6a6157463061585a6863306c4a53563971633239754c6e523464413d3d&fich=IniciativasIII_json.txt&Inline=true.

В частности, всякий раз, когда iniDescTipo == "Proposta de Lei", я ищу iniNr, dataInicioleg и dataFimleg. Кроме того, я ищу dataFase, когда fase == "Anúncio", и всякий раз, когда в iniEvntos есть словарь с fase == "Decreto (Publicação)", я хочу выводить 1 в каждой строке выходного файла и 0 в противном случае. Предполагаемый результат должен выглядеть следующим образом:

Title  Number InicioLeg FimLeg DataAnuncio Aprovado
  a      12      1991    1995     1992         1
  b      32      1991    1995     1991         1
  c      14      1991    1995     1991         0

Моя проблема - двоичная переменная. На данный момент мой код выглядит следующим образом:

r = requests.get('http://app.parlamento.pt/webutils/docs/doc.txt?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e52766379394a626d6c6a6157463061585a686379394a53556b6c4d6a424d5a57647063327868644856795953394a626d6c6a6157463061585a6863306c4a53563971633239754c6e523464413d3d&fich=IniciativasIII_json.txt&Inline=true')
r.raise_for_status()
data = r.json()

inis = data['ArrayOfPt_gov_ar_objectos_iniciativas_DetalhePesquisaIniciativasOut']['pt_gov_ar_objectos_iniciativas_DetalhePesquisaIniciativasOut']

for j in inis:
    if j['iniDescTipo'] == "Proposta de Lei":   
        for i in j['iniEventos']['pt_gov_ar_objectos_iniciativas_EventosOut']:
            if any("Decreto (Publicação)"):
                try:
                    pl.update({j['iniTitulo']: [j['iniTitulo'], j['iniNr'], j['dataInicioleg'],  j['dataFimleg'], j['iniEventos']['pt_gov_ar_objectos_iniciativas_EventosOut'][0]['dataFase'], "1"]})
                except KeyError:
                    pl.update({j['iniTitulo']: [j['iniTitulo'], j['iniNr'], j['dataInicioleg'],  j['dataFimleg'], j['iniEventos']['pt_gov_ar_objectos_iniciativas_EventosOut']['dataFase'], "0"]})      
    else:
        pass

Я не верю, что правильно использовал if any, отсюда и борьба с этим последним изменением. Я попробовал несколько советов из Проверить, существует ли уже значение в списке словарей? , L oop по всем вложенным значениям словаря? и Проверить, существует ли значение уже внутри список словарей? , но безуспешно. Кто-нибудь может указать мне на мою ошибку и, возможно, предложить мне способ получить все 5 переменных?

1 Ответ

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

Не уверен, действительно ли у меня возникла проблема, но здесь мы go:

Прежде всего, я бы порекомендовал вам избегать использования имен переменных, таких как j и i; легче понять, что делает код, если имена переменных описывают то, что они содержат.

На самом деле вы используете any() неправильным образом. any() получает итерацию, возвращает True, если хотя бы один элемент в этой итерации равен True и False в противном случае.

Одно небольшое изменение в том, что вы уже должны заставить его работать, может заменить второй для l oop для следующего:

for j in inis:
    if j['iniDescTipo'] == "Proposta de Lei":
        i = j['iniEventos']['pt_gov_ar_objectos_iniciativas_EventosOut']
        if any(map(lambda elem: elem["fase"] == "Decreto (Publicação)", i):
            try:
                pl.update({j['iniTitulo']: [j['iniTitulo'], j['iniNr'], j['dataInicioleg'],  j['dataFimleg'], j['iniEventos']['pt_gov_ar_objectos_iniciativas_EventosOut'][0]['dataFase'], "1"]})
            except KeyError:
                pl.update({j['iniTitulo']: [j['iniTitulo'], j['iniNr'], j['dataInicioleg'],  j['dataFimleg'], j['iniEventos']['pt_gov_ar_objectos_iniciativas_EventosOut']['dataFase'], "0"]})      
    else:
        pass

Таким образом, вы преобразуете свой массив i в список логических значений, которые равны True, если элемент имеет fase == "Decreto (Publicacao)" и False в противном случае; что необходимо для ввода any().

Что касается части кода try: except:, я почти уверен, что это может быть лучше, но, не зная, что содержат эти объекты, трудно рекомендовать лучшее решение.

Надеюсь, это поможет!

...