Найти элементы в Python Dict - PullRequest
0 голосов
/ 05 февраля 2020

Я получаю python словарь от AWS, который отформатирован как следующий пример объекта:

{'ResponseMetadata': {'NOT IMPORTANT'},
 'hasMoreResults': True,
 'marker': '{"NOT IMPORTANT"}',
 'pipelineIdList': [{'id': 'df-0001',
                     'name': 'Blue'},
                    {'id': 'df-0002',
                     'name': 'Orange'},
                    {'id': 'df-0003',
                     'name': 'Green'},
                    {'id': 'df-0004',
                     'name': 'Red'},
                    {'id': 'df-0005',
                     'name': 'Purple'}
]}

Я хочу запросить name ввода в pipelineIdList и получите id, который соответствует ему. Например, если вы выполняете поиск, используя строку ввода «Red», вы получите возвращаемое значение «df-0004»

Мой код выглядит следующим образом:

import boto3

def findId(pipeline_list, inputString):
  for dict in pipeline_list:
    if dict['pipelineIdList']['name'] == inputString:
      return dict['id']

def main():
  inputString = "Red"

  datapipeline = boto3.client('datapipeline')
  pipeline_list = datapipeline.list_pipelines() //This line returns a Dict like the one above

  result = findId(pipeline_list, inputString)
  print(result)


if __name__ == "__main__":
  main()

print(result) в этом случае с inputString="Red" следует вывести значение df-0004, но вместо этого оно печатает абсолютно ничего. Любая помощь в решении этой проблемы будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 05 февраля 2020

Обычно я подхожу к таким проблемам, сначала написав простую функцию. Как только вы поймете «голые кости», вы можете стать хитрее и попытаться оптимизировать код с помощью чего-то вроде понимания списка, как предлагает @Maribeth Cogan.

def findId(obj_dictionary, color):
    lst = obj_dictionary['pipelineIdList']
    for dictionary in lst:
        if dictionary['name'] == color:
            return(dictionary['id'])

Мы извлекаем список, на который мы хотим посмотреть, из данного словаря. затем go через элементы этого списка, чтобы найти элемент словаря, значение которого соответствует заданной цели color. Затем метод возвращает ключ, соответствующий этому элементу словаря.

0 голосов
/ 05 февраля 2020

Вы можете просто использовать python-benedict (это dict подкласс) и метод search:

Установка: pip install python-benedict

from benedict import benedict as bdict

d = bdict({
    'ResponseMetadata': {
        'NOT IMPORTANT'
    },
    'hasMoreResults': True,
    'marker': '{"NOT IMPORTANT"}',
    'pipelineIdList': [
        {'id': 'df-0001', 'name': 'Blue' },
        {'id': 'df-0002', 'name': 'Orange'},
        {'id': 'df-0003', 'name': 'Green'},
        {'id': 'df-0004', 'name': 'Red'},
        {'id': 'df-0005', 'name': 'Purple'}
    ]
})
results = d.search('red', in_keys=False, in_values=True, exact=True, case_sensitive=False)
for item, key, value in results:
    print(item) # {'id': 'df-0004', 'name': 'Red'}
    print(key) # 'name'
    print(value) # 'Red'

python-benedict является с открытым исходным кодом и задокументировано на GitHub :

https://github.com/fabiocaccamo/python-benedict

0 голосов
/ 05 февраля 2020

простое понимание списка может решить вашу проблему. Попробуйте запустить этот код:

my_color='Red'

result = [colorDict['id'] for colorDict in d['pipelineIdList'] if colorDict['name']==my_color][0]

значение result теперь должно быть df-0004

Объяснение : понимание списка добавляет в список id любого словаря в pipelineIdList, у которого name свойство является желаемым цветом. Поскольку для нужного цвета есть только один словарь, длина списка равна 1. Затем вы получаете доступ к первому (и единственному) элементу этого списка, который имеет индекс 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...