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
}
escória
fonte
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".

maxbellec
fonte
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]
ylnor
fonte
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.

Ryan Haining
fonte
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()))
Shital Shah
fonte
10

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

O que você quer é provavelmente collections.OrderedDict.


fonte
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
turiyag
fonte
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.

narwanimonish
fonte
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.

kylie.a
fonte
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'

Amit Sharma
fonte
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

Mark M
fonte
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.

wihlke
fonte
-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]
nasim seifi
fonte
3
Aumenta TypeError: 'dict_keys' object is not subscriptable, pelo menos com Python 3.8
Eerik Sven Puudist 07/12/19