Considere o seguinte dicionário, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Desejo retornar a primeira N pares chave: valor de d (N <= 4 neste caso). Qual é o método mais eficiente de fazer isso?
python
dictionary
Jason Strimpel
fonte
fonte
list(d.items())[:4]
. list () é a implementação subjacente para muitas das respostas.Respostas:
Não existe tal coisa de "primeiras n" chaves porque um
dict
não lembra quais chaves foram inseridas primeiro.Você pode obter quaisquer n pares de valores-chave:
Isso usa a implementação de
take
dasitertools
receitas :Veja funcionando online: ideone
Atualização para Python 3.6
fonte
iteritems
deveria ser substituído poritems
para pessoas no Python 3take()
parte da base de código python em algum lugar? Ou é puramente a função que você definiu em sua resposta aqui? Perguntando como se fosse parte da base do código, não consigo localizar / importar. :)Uma maneira muito eficiente de recuperar qualquer coisa é combinar as compreensões de lista ou dicionário com o fatiamento. Se você não precisa ordenar os itens (você só quer n pares aleatórios), você pode usar uma compreensão de dicionário como esta:
Geralmente, uma compreensão como essa é sempre mais rápida de executar do que o loop equivalente "for x in y". Além disso, ao usar .keys () para fazer uma lista das chaves do dicionário e dividir essa lista, você evita 'tocar' em quaisquer teclas desnecessárias ao construir o novo dicionário.
Se você não precisa das chaves (apenas os valores), você pode usar uma compreensão de lista:
Se você precisa dos valores classificados com base em suas chaves, não é muito mais problema:
ou se você também precisar das chaves:
fonte
Os
dict
s do Python não são ordenados, portanto, não faz sentido solicitar as "primeiras N" chaves.A
collections.OrderedDict
aula está disponível se você precisar. Você pode obter com eficiência seus primeiros quatro elementos, comoitertools.islice
permite que você preguiçosamente pegue uma fatia de elementos de qualquer iterador. Se você quiser que o resultado seja reutilizável, você precisará convertê-lo em uma lista ou algo assim:fonte
Basicamente, transforme a visão (dict_items) em um iterador e, em seguida, itere com next ().
fonte
Não vi aqui. Não será ordenado, mas o mais simples sintaticamente se você precisar apenas pegar alguns elementos de um dicionário.
fonte
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
(ações é o nome do meu dicionário)Para obter os N principais elementos de seu dicionário Python, pode-se usar a seguinte linha de código:
No seu caso, você pode alterá-lo para:
fonte
Veja PEP 0265 sobre classificação de dicionários. Em seguida, use o código iterável mencionado anteriormente.
Se você precisar de mais eficiência nos pares de valores-chave classificados. Use uma estrutura de dados diferente. Ou seja, aquele que mantém a ordem de classificação e as associações de valor-chave.
Por exemplo
fonte
em py3, isso fará o truque
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
fonte
basta adicionar uma resposta usando zip,
fonte
Isso depende do que é "mais eficiente" no seu caso.
Se você quiser apenas uma amostra semi-aleatória de um dicionário enorme
foo
, usefoo.iteritems()
e retire quantos valores forem necessários, é uma operação preguiçosa que evita a criação de uma lista explícita de chaves ou itens.Se você precisar classificar as chaves primeiro, não há como evitar o uso de algo como
keys = foo.keys(); keys.sort()
ousorted(foo.iterkeys())
, você terá que construir uma lista explícita de chaves. Em seguida, divida ou itere através dos primeiros Nkeys
.BTW, por que você se preocupa com a maneira 'eficiente'? Você definiu o perfil do seu programa? Caso contrário, use primeiro o caminho óbvio e fácil de entender . Provavelmente, ele funcionará muito bem, sem se tornar um gargalo.
fonte
Você pode abordar isso de várias maneiras. Se o pedido for importante, você pode fazer o seguinte:
Se o pedido não for uma preocupação, você pode fazer o seguinte:
fonte
value
vez deitem
para maior clareza.O dicionário não mantém nenhuma ordem, portanto, antes de escolher os N principais pares de valores-chave, vamos classificá-lo.
Agora podemos fazer a recuperação dos principais elementos 'N' :, usando a estrutura do método como esta:
para obter os 2 principais elementos, basta usar esta estrutura:
fonte
Para Python 3 e acima, para selecionar os primeiros n pares
fonte
considere um ditado
islice resolverá :) espero que ajude!
fonte
Isso pode não ser muito elegante, mas funciona para mim:
fonte
Tentei algumas das respostas acima e observe que algumas delas dependem da versão e não funcionam na versão 3.7.
Também observo que desde 3.6 todos os dicionários são ordenados pela sequência em que os itens são inseridos.
Apesar de os dicionários serem solicitados desde 3.6, algumas das instruções que você espera que funcionem com estruturas ordenadas parecem não funcionar.
A resposta à pergunta do OP que funcionou melhor para mim.
fonte
lst = list(d.items())[:N]
Abordagem incomum, pois dá complexidade de tempo O (N) intensa.
fonte