Como você encontra a primeira chave em um dicionário?


200

Estou tentando imprimir meu programa "banana" no dicionário. Qual seria a maneira mais simples de fazer isso?

Este é o meu dicionário:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
Os dicionários em Python são desordenados, portanto não há "primeira chave". Veja aqui
— David Robinson

2
Deseja imprimir literalmente a palavra "banana" ou o valor associado a "banana" (4, neste caso)?
— Paul H

to print out banana with a FOR loop, so when I run it, each key would also be printed outVocê quer dizer for k in prices: print k? Isso imprimirá todas as chaves no dicionário.
— David Robinson


7
ao primeiro comentário: em python 3.6+ dicionários são ordenados (consulte stackoverflow.com/questions/39980323/… )
— Egirus Ornila

Respostas:


284

Em uma versão Python em que os dicts são realmente ordenados, você pode fazer

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

Para que os dicts sejam ordenados, você precisa do Python 3.7+ ou 3.6+, se estiver bem em confiar na natureza ordenada tecnicamente de detalhes de implementação dos dicts no Python 3.6.

Para versões anteriores do Python, não há "primeira chave".


29
Se você deseja a chave e o valor no Python 3:next(iter( my_dict.items() ))
— Jonathan H

Os dicts do Python do @RyanHaining são ordenados por inserção, começando com o CPython 3.6 e qualquer outra implementação de Python começando com o Python 3.7
— Boris

1
Esta resposta estragou minha sessão de depuração que esperei 6 horas para chegar ao ponto de interrupção. Isso é muito irritante.
— Michael

128

Um dicionário não é indexado, mas é, de alguma forma, ordenado. A seguir, você forneceria a primeira chave existente:

list(my_dict.keys())[0]

25
Não seria mais fácil colocar list(my_dict)[0]isso, pois ele recuperará a lista de chaves?
— Jean-Francois T.

@ Jean-FrancoisT. sim
— Ryan Haining

Os dicionários são agora ordenados em CPython 3.6 e todas as outras implementações Python começando com Python 3.7
— Boris

52

Atualização: a partir do Python 3.7, a ordem de inserção é mantida, portanto você não precisa de um OrderedDictaqui. Você pode usar as abordagens abaixo com umdict

Alterado na versão 3.7: A ordem do dicionário é garantida como ordem de inserção. Esse comportamento foi um detalhe de implementação do CPython da 3.6.

fonte


Python 3.6 e versões anteriores *

Se você está falando de um regular dict, então a "primeira chave" não significa nada. As chaves não são ordenadas de nenhuma maneira em que você possa confiar. Se você iterar sobre o seu dict, provavelmente não será "banana"a primeira coisa que verá.

Se você precisar manter as coisas em ordem, precisará usar um OrderedDicte não apenas um dicionário comum.

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

Se você queria ver todas as chaves em ordem, poderia fazê-lo iterando através dela

for k in prices:
    print(k)

Você pode, alternativamente, colocar todas as chaves em uma lista e depois trabalhar com isso.

ks = list(prices)
print(ks[0]) # will print "banana"

Uma maneira mais rápida de obter o primeiro elemento sem criar uma lista seria chamar nexto iterador. Isso não generaliza muito bem ao tentar obter o nthelemento

>>> next(iter(prices))
'banana'

* O CPython garantiu a ordem de inserção como um detalhe de implementação em 3.6.


Obrigado pelo conselho. Sinto muito por não ser mais claro. Estou apenas tentando encontrar o código que me permitirá imprimir "Banana" NÃO o valor associado a ele. Obrigado por toda a entrada!
— 21315 slagoy

31

Para o Python 3 abaixo, elimina a sobrecarga da conversão da lista:

first = next(iter(prices.values()))

10

O dicttipo é um não ordenado mapeamento ; portanto, não existe um elemento "primeiro".

O que você quer é provavelmente collections.OrderedDict.


ou um namedtuple talvez se ele é imutável
— Joran Beasley

Isso mudou a partir do Python 3.6. Os dicionários estão agora ordenados.
— misantroop

1
Bem, tecnicamente, você deseja o primeiro elemento das chaves do dicionário, se tiver certeza, existe apenas uma chave.
— DBX12 20/1118

poderia-se dizer o primeiro item enquanto iterava sobre um ditado que seria corrigido. Mas boa sorte para descobrir isso.
— demongolem 6/03

6

Então, encontrei esta página ao tentar otimizar algo para pegar a única chave em um dicionário de tamanho conhecido 1 e retornar apenas a chave. O processo abaixo foi o mais rápido para todos os dicionários que tentei atingir o tamanho 700.

Tentei 7 abordagens diferentes e descobri que essa era a melhor no meu Macbook 2014 com Python 3.6:

def first_5():
    for key in biased_dict:
        return key

Os resultados da criação de perfil deles foram:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

Todas as abordagens que tentei estão aqui:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
Então, fazer um loop for e retornar a primeira tecla (first_5) é realmente a mais rápida que eu posso ver? Também uma boa comparação das diferentes abordagens.
— PiMathCLanguage 28/08/19

1
sim, e não apenas o mais rápido, mas o mais rápido por uma milha do país. Também é o mais fácil de ler, convenientemente.
— turiyag

4

Bem, como simples, a resposta de acordo comigo será

first = list(prices)[0]

converter o dicionário em lista produzirá as chaves e selecionaremos a primeira chave da lista.


Para python3, não há necessidade de criar uma lista totalmente nova para recuperar apenas seu primeiro elemento. Melhor uso next(iter(prices)), como já sugerido por outras respostas.
— normanius 16/06

1

Como muitos outros apontaram, não há primeiro valor em um dicionário. A classificação neles é arbitrária e você não pode contar com a classificação sempre que acessar o dicionário. No entanto, se você quiser imprimir as chaves, existem algumas maneiras:

for key, value in prices.items():
    print(key)

Este método usa a atribuição de tupla para acessar a chave e o valor. Isso é útil se você precisar acessar a chave e o valor por algum motivo.

for key in prices.keys():
    print(key)

Isso só dá acesso às chaves conforme o keys()método implica.


1

d.keys () [0] para obter a chave individual.

Atualização: - @AlejoBernardin, não sei por que você disse que não funcionou. aqui eu verifiquei e funcionou. importar coleções

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'banana'


Indo pelo número de votos, por que essa não é a melhor solução boa?
— precisa saber é

18
Isso funciona em python2, mas não python3. Em python3, dict.keys()retorna a em 'dict_keys' objectvez de a list, que não suporta indexação.
— Mavix

TypeError: o objeto 'dict_keys' não oferece suporte à indexação
— anilbey

0

Use um loop for que abrange todas as chaves em prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

Certifique-se de alterar prices.items()para prices.iteritems()se você estiver usando o Python 2.x


0

Se você quiser apenas a primeira chave de um dicionário, use o que muitos sugeriram antes

first = next(iter(prices))

No entanto, se você quiser o primeiro e manter o restante como uma lista, poderá usar o operador de desempacotamento de valores

first, *rest = prices

O mesmo se aplica aos valores, substituindo pricespor prices.values()e para chave e valor que você pode até usar atribuição de descompactação

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

Nota: Você pode ficar tentado a usar first, *_ = pricesapenas a primeira chave, mas geralmente aconselho esse uso, a menos que o dicionário seja muito curto, pois ele passa por todas as chaves e cria uma lista para as que restpossuem alguma sobrecarga.

Nota: Conforme mencionado por outros, a ordem de inserção é preservada do python 3.7 (ou tecnicamente 3.6) e acima, enquanto as implementações anteriores devem ser consideradas como ordem indefinida.


-3

A maneira mais fácil é:

first_key = my_dict.keys()[0]

mas algumas vezes você deve ter mais cuidado e garantir que sua entidade seja uma lista valiosa para:

first_key = list(my_dict.keys())[0]

3
Aumenta TypeError: 'dict_keys' object is not subscriptable, pelo menos com Python 3.8
— Eerik Sven Puudist 07/12/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.