Двоеточие: оператор в списке

Я привык использовать Matlab и его мощный оператор двоеточия. Кажется, что в Python есть эквивалент, но не полностью, когда он содержит dict. Вот мой пример:

data = [
    {'key1' : 'value1', 'key2' : 'value2'},
    {'key1' : 'value3', 'key2' : 'value4'},
    {'key1' : 'value1', 'key2' : 'value5'}
]

data[0:2] работает и возвращает [{'key1': 'value1', 'key2': 'value2'}, {'key1': 'value3', 'key2': 'value4'}] (однако я бы инстинктивно использовал 0:1, чтобы получить тот же результат)

но

data[0:2]['key2'] не делает и возвращает list indices must be integers, not str

Должен ли я сделать вывод, что : можно использовать только в списке, не содержащем dict, или я неправильно его печатаю?

Спасибо,


person Maxime    schedule 28.10.2017    source источник
comment
Вы действительно должны научиться использовать спецификаторы диапазона. Это настолько фундаментально для Python, что вы должны были изучить его в течение первого часа использования Python. Для списка x указание x[a:b] возвращает фрагмент x, первый индекс которого равен a, а последний индекс равен b-1 включительно. Но это все же список. В вашем случае этот список содержит два словаря. Если вы хотите получить доступ к элементу dict, вы должны сначала выбрать один элемент из списка (или из среза). Например. data[0:2][1]['key2'] или data[1]['key2']   -  person Tom Karzes    schedule 28.10.2017
comment
Вы не путаете два разных использования :? Его использование при указании словаря никак не связано с его использованием в слайсе [0:2]. Любая последовательность может быть нарезана, включая списки, кортежи и строки, независимо от класса объектов, к которым относятся элементы.   -  person cdarke    schedule 28.10.2017


Ответы (1)


Должен ли я сделать вывод, что : можно использовать только в списке, не содержащем dict, или я неправильно его печатаю?

Это не правильный вывод. : можно использовать с любым списком.

Проблема в том, что data[0:2] - это список. Если вы хотите получить список значений 'key2' элементов в data[0:2], вам нужно написать это как понимание списка:

>>> [v['key2'] for v in data[0:2]]
... ['value2', 'value4']

Если вы предпочитаете использовать оператор вместо понимания списка, вы можете использовать следующее:

>>> from operator import itemgetter
>>> map(itemgetter('key2'), data[0:2])
... ['value2', 'value4']
person janos    schedule 28.10.2017