Python для цикла. Извлечение определенного значения из AWS

#python #for-loop #boto3

#python #для цикла #boto3

Вопрос:

Я пытаюсь заставить цикл for работать в boto3, и хотя он у меня работает, разобраться в нем было сложно. На данный момент у меня есть:

   `spot_requests = ec2.describe_spot_instance_requests()
   for index in spot_requests['SpotInstanceRequests']:
        instanceID = index["InstanceId"]
        instanceState = index["State"]
        spotRequestID = index["SpotInstanceRequestId"]

    print(f'{instanceID} is {instanceState} and has a request ID of {spotRequestID}')`
  

который возвращает что-то вроде:

«I-1234556 отключен и имеет идентификатор запроса sir-12344»

чего я не понимаю, так это почему индекс должен быть там после знака = и почему он выдает ошибки, если у меня просто есть:

instanceID = ["InstanceId"]

Кроме того, я понимаю, как работают словари, вы ссылаетесь на имя словаря, а затем в [квадратных скобках] на ключ, для которого вы хотите найти значение. Однако, когда я пытаюсь это сделать (что, по-видимому, правильно)

     `describe_instance = ec2.describe_instances()
     for item2 in describe_instance['Reservations']:
        instance_state = item2['Instances'][0]["State"]["Name"]`
  

Я не понимаю, что делает [0], поскольку в словаре нет ключа со значением 0. И что бы я сделал, если бы в этом был вложенный словарь? будет ли это что-то вроде этого:

 describe_instance = ec2.describe_instances()
 for item2 in describe_instance['Reservations']:
     instance_state = item2['Instances'][0]["State"]["Name"][0]["Nested value I want to find"]
  

Спасибо

Ответ №1:

чего я не понимаю, так это почему индекс должен быть там после знака = и почему он выдает ошибки, если у меня просто есть:

«индекс» существует, потому что это dict, из которого вы хотите получить указанное значение.

Я не понимаю, что делает [0], поскольку в словаре нет ключа со значением 0.

Синтаксис [<число>] указывает, что вы пытаетесь получить значение из списка, где число указывает, какой индекс в списке вы хотите получить. В вашем конкретном случае объект ‘Instances’ в item2 представляет собой список dicts, содержащий информацию обо всех экземплярах EC2. Именно поэтому вы можете использовать [‘State’][‘Name’], чтобы получить имя состояния, в котором в данный момент находится экземпляр.

И что бы я сделал, если бы в этом был вложенный словарь? будет ли это что-то вроде этого:

Если поле ‘Name’ будет содержать список dicts (что не имеет смысла), тогда вы могли бы сделать то, что вы предлагаете в своем последнем примере.

Комментарии:

1. итак, «индекс» говорит, что из индекса dic получает «состояние», «идентификатор экземпляра» и т. Д.? И для второго пункта с [0], вы имеете в виду, что первая строка: describe_instance = ec2.describe_instances() — возвращает словарь, а цикл for — для item2 в describe_instance[‘Reservations’]: возвращает список? и поэтому [0] затем получает первое значение из этого списка с именем ‘State’? большое спасибо

2. describe_instance['Reservations'] возвращает dict, который присваивается item2 . Однако объект ‘Instances’ в этом dict представляет собой список. Список dicts, поэтому вы можете выполнить ['State'] над ним, чтобы получить State dict . В этом dict есть поле с именем ‘Name’, которое вы получаете с последним ['Name'] .

3. большое вам спасибо, Исак. мои извинения, но в отношении [0], когда возвращается все это значение, его начало выглядит следующим образом: {‘Reservations’: [{‘Groups’: [], ‘Instances’: [{‘AmiLaunchIndex’ …. так что я не совсем понимаюразве [‘Instances’] [0] не должен возвращать обратно ‘AmiLaunchIndex’ . спасибо, хотя я понимаю все остальное, как он получает внутренний словарь, но я все еще не до конца понимаю этот шаг

4. Вы почти правы. Как вы можете видеть по квадратным и фигурным скобкам, «Экземпляры» также являются списком dicts («Экземпляры»: [{ ‘AmiLaunchIndex’ …). При выполнении ['Instances'][0] вы получаете dict с индексом 0 в этом списке. Затем из этого dict вы получаете атрибут состояния (из которого вы, наконец, получаете имя).

5. о, я понимаю, спасибо. Таким образом, между [ и { и [‘Instances’][0] есть невидимое имя dict, и [‘Instances’][0] получает это имя. Это было бы правильно? Большое вам спасибо, Исак