Bagaimana cara mencetak kunci kamus?


213

Saya ingin mencetak kunci kamus Python tertentu:

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

Sekarang saya dapat memeriksa apakah mydic.has_key('key_name'), tetapi apa yang ingin saya lakukan adalah mencetak nama kunci 'key_name'. Tentu saja saya bisa menggunakan mydic.items(), tetapi saya tidak ingin semua kunci terdaftar, hanya satu kunci spesifik. Sebagai contoh, saya mengharapkan sesuatu seperti ini (dalam pseudo-code):

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

Apakah ada name_the_key()metode untuk mencetak nama kunci?


Sunting: Oke, terima kasih banyak kawan atas reaksi Anda! :) Saya menyadari pertanyaan saya tidak dirumuskan dengan baik dan sepele. Saya baru saja bingung karena saya menyadari key_name dan mydic['key_name']dua hal yang berbeda dan saya pikir akan salah untuk mencetak key_namekonteks kamus. Tapi memang saya bisa menggunakan 'key_name' untuk merujuk ke kunci! :)


19
Jika Anda tahu apa kunci spesifik yang Anda inginkan, umm, Anda sudah tahu apa kuncinya.
Wooble

Jawaban:


382

Kamus memiliki, menurut definisi, jumlah kunci yang sewenang-wenang. Tidak ada "kunci". Anda memiliki keys()metode, yang memberi Anda python listdari semua kunci, dan Anda memiliki iteritems()metode, yang mengembalikan pasangan nilai kunci, jadi

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

Versi Python 3:

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

Jadi Anda memiliki pegangan pada kunci, tetapi mereka hanya benar-benar masuk akal jika digabungkan ke suatu nilai. Saya harap saya mengerti pertanyaan Anda.


1
Meskipun ini bekerja dengan baik untuk saya di Python 2.7, apa alternatifnya di Py3k? Saya tahu .iteritems()tidak lagi didukung ...
piperchester

5
@ PolyShell alternatif dalam python 3, jika itu yang Anda maksud dengan Py3k (saya sudah jauh dari python untuk sementara waktu sekarang) itu .items(). Saya menambahkan contoh.
juanchopanza

1
@Bibha Mereka berdua bekerja, tetapi semantiknya berbeda. items()mengembalikan daftar dengan python 2.x.
juanchopanza

73

Selain itu Anda dapat menggunakan ....

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

Terima kasih! Inilah yang sebenarnya saya cari :)
Masoud Maleki

34

Hmm, saya pikir apa yang mungkin ingin Anda lakukan adalah mencetak semua kunci dalam kamus dan nilainya masing-masing?

Jika demikian Anda menginginkan yang berikut:

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

Pastikan Anda menggunakan + sebagai ganti, 'juga. Saya pikir koma akan menempatkan masing-masing item pada baris terpisah, sedangkan plus akan menempatkannya pada baris yang sama.


2
koma akan meninggalkan mereka pada baris yang sama, tetapi masukkan spasi di antara "is"dan keylain - lain. Jika Anda menggunakan, +Anda harus meletakkan bantalan ekstra di string. Juga kunci dan nilai tidak harus berupa string, dalam hal ini koma akan menggunakan str (kunci) dan str (nilai) sedangkan +akan menyebabkan kesalahan
John La Rooy

1
Ini adalah satu jawaban yang saya tahu tidak benar, karena OP berkata, "Saya tidak ingin semua kunci terdaftar."
Ned Batchelder

Untuk beberapa alasan saya berpikir sebaliknya untuk koma; Anda benar tentang itu. Saya juga sudah membaca ulang pertanyaannya, sepertinya kita telah menuliskan 'semua' dalam huruf tebal - buruk saya.
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

Catatan: Dalam Python 3, dic.iteritems () diubah namanya menjadi dic.items ()


25

Nama kunci 'key_name' adalah key_name, oleh karena itu print 'key_name'atau variabel apa pun yang Anda wakili.


10

Dengan 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

Karena kita semua mencoba menebak apa arti "mencetak nama kunci", saya akan coba. Mungkin Anda menginginkan fungsi yang mengambil nilai dari kamus dan menemukan kunci yang sesuai? Pencarian terbalik?

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

Perhatikan bahwa banyak kunci dapat memiliki nilai yang sama, jadi fungsi ini akan mengembalikan beberapa kunci yang memiliki nilai, mungkin bukan yang Anda maksudkan.

Jika Anda perlu sering melakukan ini, masuk akal untuk membuat kamus terbalik:

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

Perhatikan (seperti di atas) bahwa iteritem hanya menjadi 'item' dalam Python 3.
Mike

Perhatian: jika Anda mengubah iteritemske items, maka seperti yang ditunjukkan pada awalnya, jawaban ini hanya akan mengembalikan kunci pertama - jika ada beberapa kecocokan. Untuk mengatasi ini, buat daftar kosong sebelum for loop( values_list = []), lalu tambahkan kunci ke daftar ini ( values_list.append(k)), dalam ifloop. Terakhir, pindahkan pernyataan kembali ( return values_list) di luar forloop.
Victoria Stuart

4

Atau Anda dapat melakukannya dengan cara itu:

for key in my_dict:
     print key, my_dict[key]

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

Sunting: Diperbarui untuk f-string python 3 ...


3

Pastikan untuk melakukannya

dictionary.keys()
# rather than
dictionary.keys

2

Apa yang salah dengan menggunakan 'key_name', bahkan jika itu adalah variabel?



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

Mungkin cara tercepat untuk hanya mengambil nama kunci:

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

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

Hasil:

key_name

Mengonversi dictionarymenjadi menjadi listlalu mencantumkan elemen pertama yang merupakan keseluruhan dictlalu mencantumkan nilai pertama dari elemen tersebut yaitu:key_name


Mengapa mengambil nilai juga?
Martijn Pieters

1

Saya mencari pertanyaan ini, karena saya ingin tahu cara mengambil nama "kunci" jika kamus saya hanya punya satu entri. Dalam kasus saya, kuncinya tidak diketahui oleh saya dan bisa berupa beberapa hal. Inilah yang saya pikirkan:

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

Coba ini:

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

Jika Anda ingin mendapatkan kunci dari satu nilai, berikut ini akan membantu:

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

Secara pythonic:

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

0

Saya menambahkan jawaban ini sebagai salah satu jawaban lain di sini ( https://stackoverflow.com/a/5905752/1904943 ) bertanggal (Python 2; iteritems), dan kode yang disajikan - jika diperbarui untuk Python 3 per yang disarankan solusi dalam komentar untuk jawaban itu - diam-diam gagal mengembalikan semua data yang relevan.


Latar Belakang

Saya memiliki beberapa data metabolik, terwakili dalam grafik (node, edge, ...). Dalam representasi kamus dari data tersebut, kunci berbentuk (604, 1037, 0)(mewakili sumber dan target node, dan jenis tepi), dengan nilai -nilai bentuk 5.3.1.9(mewakili kode enzim EC).

Temukan kunci untuk nilai yang diberikan

Kode berikut dengan benar menemukan kunci saya, memberikan nilai:

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)]

sedangkan kode ini hanya mengembalikan kunci pertama (dari beberapa kemungkinan yang cocok):

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)

Kode terakhir, naif diperbarui mengganti iteritemsdengan items, gagal untuk kembali (604, 3936, 0), (1037, 3936, 0.


0

Untuk mengakses data, Anda harus melakukan ini:

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

Atau, untuk mengakses nilai yang Anda sebut saja dari kunci: foo[bar]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.