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! :)

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

juanchopanza
fonte
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
Pedreiro
fonte
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.

Dominic Santos
fonte
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 ()

ademar111190
fonte
25

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

zenna
fonte
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))))
Fouad Boukredine
fonte
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())
Ned Batchelder
fonte
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

Ou você pode fazer dessa maneira:

for key in my_dict:
     print key, my_dict[key]
Eugene Soldatov
fonte
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 ...

Brian Bruggeman
fonte
3

Certifique-se de fazer

dictionary.keys()
# rather than
dictionary.keys
Crt
fonte
2

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

Ry-
fonte
2
import pprint
pprint.pprint(mydic.keys())
Matt Joiner
fonte
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)
Rob Wilson
fonte
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

Fekete Sumér
fonte
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.
PeaWagon
fonte
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
fdb
fonte
0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])
Don
fonte
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)
Jeril
fonte
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.

Victoria Stuart
fonte
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]

mmendescortes
fonte