Digamos que eu tenha o seguinte código:
import collections
d = collections.OrderedDict()
d['foo'] = 'python'
d['bar'] = 'spam'
Existe uma maneira de acessar os itens de maneira numerada, como:
d(0) #foo's Output
d(1) #bar's Output
Digamos que eu tenha o seguinte código:
import collections
d = collections.OrderedDict()
d['foo'] = 'python'
d['bar'] = 'spam'
Existe uma maneira de acessar os itens de maneira numerada, como:
d(0) #foo's Output
d(1) #bar's Output
Se for um, OrderedDict()
você pode acessar facilmente os elementos indexando, obtendo as tuplas de pares (chave, valor) da seguinte maneira
>>> import collections
>>> d = collections.OrderedDict()
>>> d['foo'] = 'python'
>>> d['bar'] = 'spam'
>>> d.items()
[('foo', 'python'), ('bar', 'spam')]
>>> d.items()[0]
('foo', 'python')
>>> d.items()[1]
('bar', 'spam')
Nota para Python 3.X
dict.items
retornaria um objeto de exibição de ditado iterável em vez de uma lista. Precisamos agrupar a chamada em uma lista para possibilitar a indexação
>>> items = list(d.items())
>>> items
[('foo', 'python'), ('bar', 'spam')]
>>> items[0]
('foo', 'python')
>>> items[1]
('bar', 'spam')
items
método retorna um objeto de exibição de dicionário interável em vez de uma lista e não oferece suporte a fatias ou indexação. Então você teria que transformá-lo em uma lista primeiro. docs.python.org/3.3/library/stdtypes.html#dict-viewslist(d.items())
list(d.items())
usandonext(islice(d.items(), 1))
para obter('bar', 'spam')
Você precisa usar um OrderedDict ou deseja especificamente um tipo de mapa que é ordenado de alguma forma com indexação posicional rápida? Se este for o caso, considere um dos muitos tipos de ditado classificado do Python (que ordena pares de valor-chave com base na ordem de classificação). Algumas implementações também oferecem suporte à indexação rápida. Por exemplo, o projeto de contêineres classificados possui um tipo SortedDict para esse fim.
fonte
SortedDict
com uma função de tecla para evitar comparações. Como:SortedDict(lambda key: 0, ...)
. As chaves serão desordenadas, mas permanecerão em uma ordem estável e são indexáveis.Aqui está um caso especial se você deseja a primeira entrada (ou próxima a ela) em um OrderedDict, sem criar uma lista. (Isso foi atualizado para o Python 3):
(A primeira vez que você diz "next ()", significa realmente "primeiro".)
No meu teste informal,
next(iter(d.items()))
com um pequeno OrderedDict é apenas um pouquinho mais rápido queitems()[0]
. Com um OrderedDict de 10.000 entradas,next(iter(d.items()))
foi cerca de 200 vezes mais rápido queitems()[0]
.MAS, se você salvar a lista de itens () uma vez e depois usá-la muito, isso poderá ser mais rápido. Ou se você repetidamente {criar um iterador de itens () e percorrê-lo para a posição desejada}, isso poderá ser mais lento.
fonte
OrderedDict
s não tem umiteritems()
método, então você vai precisar fazer o seguinte, a fim de obter o primeiro item:next(iter(d.items()))
.d.items()
não parece ser um iterador, então o iter na frente não ajudará? Ele ainda retornará a lista completa :(odict_iterator
e me foi confirmado no IRC #python que isso não faz uma cópia da lista.É muito mais eficiente usar o IndexedOrderedDict do
indexed
pacote.Após o comentário de Niklas, fiz um benchmark no OrderedDict e IndexedOrderedDict com 1000 entradas.
IndexedOrderedDict é ~ 100 vezes mais rápido nos elementos de indexação em uma posição específica nesse caso específico.
fonte
indexed.py
vez deindexed
.Este wiki da comunidade tenta coletar respostas existentes.
Python 2.7
Em python 2, as
keys()
,values()
eitems()
funções deOrderedDict
listas de retorno. Usandovalues
como exemplo, a maneira mais simples éPara grandes coleções onde você só se preocupam com um único índice, você pode evitar criar a lista completa usando as versões do gerador,
iterkeys
,itervalues
eiteritems
:O pacote indexed.py fornece
IndexedOrderedDict
, projetado para esse caso de uso e será a opção mais rápida.O uso de itervalues pode ser consideravelmente mais rápido para dicionários grandes com acesso aleatório:
Python 3.6
O Python 3 tem as mesmas duas opções básicas (lista versus gerador), mas os métodos dict retornam geradores por padrão.
Método de lista:
Método gerador:
Os dicionários do Python 3 são uma ordem de magnitude mais rápida que o python 2 e têm acelerações semelhantes para usar geradores.
fonte
É uma nova era e, com os dicionários Python 3.6.1, agora eles mantêm sua ordem. Essa semântica não é explícita porque isso exigiria a aprovação do BDFL. Mas Raymond Hettinger é a próxima melhor coisa (e engraçado) e ele faz uma muito forte caso que os dicionários serão ordenados por um tempo muito longo.
Então agora é fácil criar fatias de um dicionário:
Nota: A preservação dictonária de ordem de inserção agora é oficial no Python 3.7 .
fonte
para OrderedDict (), você pode acessar os elementos indexando obtendo as tuplas dos pares (chave, valor) da seguinte forma ou usando '.values ()'
fonte