Como imprimir a chave de um dicionário?


213

Gostaria de imprimir uma chave de dicionário Python específica:

mydic = {}
mydic['key_name'] = 'value_name'

Agora posso verificar se mydic.has_key('key_name'), mas o que eu gostaria de fazer é imprimir o nome da chave 'key_name'. É claro que eu poderia usar mydic.items(), mas não quero todas as chaves listadas, apenas uma chave específica. Por exemplo, eu esperaria algo assim (em pseudo-código):

print "the key name is", mydic['key_name'].name_the_key(), "and its value is", mydic['key_name']

Existe algum name_the_key()método para imprimir um nome de chave?


Edit: OK, muito obrigado por suas reações! :) Sei que minha pergunta não é bem formulada e trivial. Fiquei confuso porque percebi key_name e mydic['key_name']são duas coisas diferentes e achei incorreto imprimir key_namefora do contexto do dicionário. Mas na verdade eu posso simplesmente usar o 'nome_da_chave' para me referir à chave! :)


19
Se você sabe qual é a chave específica que deseja, umm, já sabe qual é a chave.
Wooble 5/05

Respostas:


381

Um dicionário possui, por definição, um número arbitrário de chaves. Não existe "a chave". Você tem o keys()método, que fornece um python listde todas as chaves, e o iteritems()método, que retorna pares de valores-chave;

for key, value in mydic.iteritems() :
    print key, value

Versão Python 3:

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

Então você tem um controle sobre as teclas, mas elas realmente significam sentido se acopladas a um valor. Espero ter entendido sua pergunta.


1
Embora isso tenha funcionado muito bem para mim no Python 2.7, qual é a alternativa no Py3k? Eu sei que .iteritems()não é mais suportado ...
piperchester

5
@ PolyShell a alternativa no python 3, se é isso que você quer dizer com Py3k (estou longe do python há algum tempo) .items(). Eu adicionei um exemplo.
juanchopanza

1
@ Bibhas Ambos funcionam, mas a semântica é diferente. items()retorna uma lista no python 2.x.
Juanchopanza

72

Além disso, você pode usar ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values

Obrigado! Isto é o que eu estava procurando exatamente :)
Masoud Maleki

34

Hmm, acho que o que você pode querer fazer é imprimir todas as chaves do dicionário e seus respectivos valores?

Nesse caso, você deseja o seguinte:

for key in mydic:
  print "the key name is" + key + "and its value is" + mydic[key]

Certifique-se de usar + 'em vez de' também. A vírgula colocará cada um desses itens em uma linha separada, eu acho, onde o plus colocará na mesma linha.


2
a vírgula os deixará na mesma linha, mas insira espaços entre "is"e keyetc. Se você usar, +precisará colocar o preenchimento extra nas cordas. Também chave e valor não são necessariamente corda, caso em que a vírgula vai usar str (key) e str (valor), enquanto que +causará um erro
John La Rooy

1
Essa é a única resposta que sei que não está certa, já que o OP disse: "Não quero todas as chaves listadas".
Ned Batchelder

Por alguma razão, pensei o contrário na vírgula; você está certo nisso. Também reli a pergunta, parece que nós dois colocamos 'tudo' em negrito - meu mal.
Dominic Santos

32
dic = {"key 1":"value 1","key b":"value b"}

#print the keys:
for key in dic:
    print key

#print the values:
for value in dic.itervalues():
    print value

#print key and values
for key, value in dic.iteritems():
    print key, value

Nota: No Python 3, dic.iteritems () foi renomeado como dic.items ()


25

O nome da chave 'key_name' é key_name, portanto, print 'key_name'ou qualquer variável que você tenha representando.


10

No Python 3:

# A simple dictionary
x = {'X':"yes", 'Y':"no", 'Z':"ok"}

# To print a specific key (for example key at index 1)
print([key for key in x.keys()][1])

# To print a specific value (for example value at index 1)
print([value for value in x.values()][1])

# To print a pair of a key with its value (for example pair at index 2)
print(([key for key in x.keys()][2], [value for value in x.values()][2]))

# To print a key and a different value (for example key at index 0 and value at index 1)
print(([key for key in x.keys()][0], [value for value in x.values()][1]))

# To print all keys and values concatenated together
print(''.join(str(key) + '' + str(value) for key, value in x.items()))

# To print all keys and values separated by commas
print(', '.join(str(key) + ', ' + str(value) for key, value in x.items()))

# To print all pairs of (key, value) one at a time
for e in range(len(x)):
    print(([key for key in x.keys()][e], [value for value in x.values()][e]))

# To print all pairs (key, value) in a tuple
print(tuple(([key for key in x.keys()][i], [value for value in x.values()][i]) for i in range(len(x))))

8

Como todos estamos tentando adivinhar o que "imprimir um nome de chave" pode significar, vou tentar. Talvez você queira uma função que retire um valor do dicionário e encontre a chave correspondente? Uma pesquisa inversa?

def key_for_value(d, value):
    """Return a key in `d` having a value of `value`."""
    for k, v in d.iteritems():
        if v == value:
            return k

Observe que muitas chaves podem ter o mesmo valor; portanto, essa função retornará alguma chave com o valor, talvez não o que você pretendia.

Se você precisar fazer isso com frequência, faria sentido construir o dicionário reverso:

d_rev = dict(v,k for k,v in d.iteritems())

Observe (como acima) que os iteritems tornaram-se simplesmente 'itens' no Python 3. #
Mike

Cuidado: se você mudar iteritemspara items, como mostrado originalmente, esta resposta retornará apenas a primeira tecla - se houver várias correspondências. Para resolver isso, crie uma lista em branco antes de for loop( values_list = []) e, em seguida, adicione chaves a esta lista ( values_list.append(k)), no ifloop. Por último, mova a declaração de retorno ( return values_list) para fora do forloop.
Victoria Stuart


4
# highlighting how to use a named variable within a string:
mapping = {'a': 1, 'b': 2}

# simple method:
print(f'a: {mapping["a"]}')
print(f'b: {mapping["b"]}')

# programmatic method:
for key, value in mapping.items():
    print(f'{key}: {value}')

# yields:
# a 1
# b 2

# using list comprehension
print('\n'.join(f'{key}: {value}' for key, value in dict.items()))


# yields:
# a: 1
# b: 2

Edit: Atualizado para as strings f do python 3 ...


3

Certifique-se de fazer

dictionary.keys()
# rather than
dictionary.keys

2

O que há de errado em usar 'key_name', mesmo que seja uma variável?



1
dict = {'name' : 'Fred', 'age' : 100, 'employed' : True }

# Choose key to print (could be a user input)
x = 'name'

if x in dict.keys():
    print(x)

1

Provavelmente, a maneira mais rápida de recuperar apenas o nome da chave:

mydic = {}
mydic['key_name'] = 'value_name'

print mydic.items()[0][0]

Resultado:

key_name

Converte o dictionaryem um liste lista o primeiro elemento que é o todo. Em dictseguida, lista o primeiro valor desse elemento que é:key_name


Por que recuperar o valor também?
Martijn Pieters

1

Eu procurei essa pergunta, porque queria saber como recuperar o nome da "chave" se meu dicionário tivesse apenas uma entrada. No meu caso, a chave era desconhecida para mim e poderia haver várias coisas. Aqui está o que eu vim com:

dict1 = {'random_word': [1,2,3]}
key_name = str([key for key in dict1]).strip("'[]'")        
print(key_name)  # equal to 'random_word', type: string.

0

Tente o seguinte:

def name_the_key(dict, key):
    return key, dict[key]

mydict = {'key1':1, 'key2':2, 'key3':3}

key_name, value = name_the_key(mydict, 'key2')
print 'KEY NAME: %s' % key_name
print 'KEY VALUE: %s' % value

0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])

0

Se você deseja obter a chave de um único valor, o seguinte ajudaria:

def get_key(b): # the value is passed to the function
    for k, v in mydic.items():
        if v.lower() == b.lower():
            return k

De maneira pitônica:

c = next((x for x, y in mydic.items() if y.lower() == b.lower()), \
     "Enter a valid 'Value'")
print(c)

0

Estou adicionando esta resposta como uma das outras respostas aqui ( https://stackoverflow.com/a/5905752/1904943 ) está datada (Python 2; iteritems) e o código apresentado - se atualizado para Python 3 de acordo com a sugestão solução alternativa em um comentário para essa resposta - silenciosamente falha ao retornar todos os dados relevantes.


fundo

Eu tenho alguns dados metabólicos, representados em um gráfico (nós, arestas, ...). Em uma representação de dicionário desses dados, as chaves são do formato (604, 1037, 0)(representando os nós de origem e de destino e o tipo de borda), com valores do formato 5.3.1.9(representando os códigos enzimáticos da CE).

Encontre chaves para valores fornecidos

O código a seguir localiza minhas chaves corretamente, com valores:

def k4v_edited(my_dict, value):
    values_list = []
    for k, v in my_dict.items():
        if v == value:
            values_list.append(k)
    return values_list

print(k4v_edited(edge_attributes, '5.3.1.9'))
## [(604, 1037, 0), (604, 3936, 0), (1037, 3936, 0)]

enquanto esse código retorna apenas as primeiras (possivelmente de várias correspondências):

def k4v(my_dict, value):
    for k, v in my_dict.items():
        if v == value:
            return k

print(k4v(edge_attributes, '5.3.1.9'))
## (604, 1037, 0)

O último código, atualizado ingenuamente substituindo iteritemspor items, falha ao retornar (604, 3936, 0), (1037, 3936, 0.


0

Para acessar os dados, você precisará fazer o seguinte:

foo = {
    "foo0": "bar0",
    "foo1": "bar1",
    "foo2": "bar2",
    "foo3": "bar3"
}
for bar in foo:
  print(bar)

Ou, para acessar o valor, basta chamá-lo na chave: foo[bar]

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.