#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] получает это имя. Это было бы правильно? Большое вам спасибо, Исак