Bir sözlüğün anahtarı nasıl yazdırılır?


213

Belirli bir Python sözlük anahtarı yazdırmak istiyorum:

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

Şimdi olup olmadığını kontrol edebilirim mydic.has_key('key_name'), ancak yapmak istediğim anahtarın adını yazdırmak 'key_name'. Tabii ki kullanabilirdim mydic.items(), ama listelenen tüm anahtarları istemiyorum , sadece belirli bir anahtar. Örneğin ben böyle bir şey beklenir (sözde kod):

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

name_the_key()Anahtar adı yazdırmak için herhangi bir yöntem var mı ?


Düzenleme: Tamam, tepkilerin için çok teşekkürler! :) Sorumun iyi formüle ve önemsiz olmadığını anlıyorum. Ben sadece karıştı çünkü key_name gerçekleştirdi ve mydic['key_name']iki farklı şey ve ben key_namesözlük bağlamı yazdırmak yanlış olacağını düşündüm . Ama aslında sadece 'key_name' anahtarına başvurmak için kullanabilirsiniz! :)


19
İstediğiniz anahtarın ne olduğunu biliyorsanız, umm, anahtarın ne olduğunu zaten biliyorsunuzdur.
Wooble

Yanıtlar:


382

Bir sözlükte tanım gereği rastgele sayıda anahtar vardır. "Anahtar" yok. Size tüm anahtarların keys()bir pitonunu veren yönteme sahipsiniz listve iteritems()anahtar / değer çiftlerini döndüren yönteme sahipsiniz.

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

Python 3 sürümü:

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

Yani tuşların üzerinde bir tutamacınız var, ancak bunlar gerçekten bir değere bağlıysa mantıklı. Umarım sorunuzu anladım.


1
Bu Python 2.7'de benim için güzel bir şekilde çalıştı, ancak Py3k'te alternatif nedir? .iteritems()Artık desteklenmediğini biliyorum ...
piperchester

5
@PolyShell python 3'te alternatif, eğer Py3k tarafından kastediyorsanız (bir süredir python'dan uzaktayım) .items(). Bir örnek ekledim.
juanchopanza

1
@Bibhas İkisi de çalışıyor, ama anlambilim farklı. items()python 2.x'te bir liste döndürür.
juanchopanza

73

Ayrıca kullanabilirsiniz ....

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

Teşekkürler! Tam da aradığım şey buydu :)
Masoud Maleki

34

Hmm, bence yapmak istediğin şey sözlükteki tüm anahtarları ve ilgili değerleri basmak mı?

Eğer öyleyse aşağıdakileri istiyorsunuz:

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

'Yerine' + işaretlerini kullandığınızdan emin olun. Virgül, bu öğelerin her birini, artı olarak aynı satıra koyacağımı düşündüğüm ayrı bir satıra koyacaktır.


2
virgül aynı satırda bırakın, fakat aralarında boşluklar ekler "is"ve keykullanırsanız vb +Eğer dizelerinde ekstra dolgu koymak gerekir. Ayrıca anahtar ve değer mutlaka dize değildir, bu durumda virgül str (key) ve str (value) kullanırken +hataya neden olur
John La Rooy

1
OP, "Tüm anahtarların listelenmesini istemiyorum" dediğinden, doğru olmadığını bildiğim tek cevap bu.
Ned Batchelder

Nedense virgül için başka türlü düşündüm; sen haklısın. Soruyu da tekrar okudum, ikimiz de 'hepsini' koyu yazdık - kötü.
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

Not: Python 3'te dic.iteritems (), dic.items () olarak yeniden adlandırıldı


25

'Key_name' anahtarının adı anahtar_adı'dır, bu nedenle print 'key_name'veya onu temsil eden değişkeniniz varsa.


10

Python 3'te:

# 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

Hepimiz "bir anahtar adı yazdır" ın ne anlama gelebileceğini tahmin etmeye çalıştığımızdan, bir sapma atacağım. Belki de sözlükten bir değer alan ve karşılık gelen anahtarı bulan bir fonksiyon mu istiyorsunuz? Geriye doğru arama?

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

Birçok anahtarın aynı değere sahip olabileceğini unutmayın, bu nedenle bu işlev değere sahip bazı anahtarları döndürür , belki de amaçladığınız anahtar değil.

Bunu sık sık yapmanız gerekiyorsa, ters sözlüğü oluşturmak mantıklı olacaktır:

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

Not iteritems'in Python 3'te basitçe 'eşya' olduğuna dikkat edin.
Mike

Dikkat: değiştirirseniz iteritemsiçin items, daha sonra orijinal olarak gösterilen bu cevabı sadece ilk anahtar dönecektir - birden çok eşleşme varsa. Bunu çözmek için, for loop(values_list = [] ) öğesinden , ardından döngüde bu listeye ( values_list.append(k)) anahtar ekleyin if. Son olarak, return ifadesini ( return values_list) fordöngü dışına taşıyın .
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

Düzenleme: Python 3'ün f-dizeleri için güncellendi ...


3

Yaptığınızdan emin olun

dictionary.keys()
# rather than
dictionary.keys

2

'key_name'Değişken olsa bile kullanmakta yanlış olan ne ?



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

Muhtemelen sadece anahtar adını almanın en hızlı yolu:

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

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

Sonuç:

key_name

Dönüştürür dictionarybir içine listo zaman bütün birinci eleman listeler dicto zaman olduğu elemanın ilk değerini listeler:key_name


Değeri neden alsın?
Martijn Pieters

1

Bu soruyu aradım, çünkü sözlüğümde yalnızca bir giriş varsa "anahtar" adını nasıl alacağımı bilmek istedim. Benim durumumda, anahtar benim için bilinmiyordu ve çok sayıda şey olabilirdi. İşte ben geldim:

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

Bunu dene:

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

Tek bir değerin anahtarını almak istiyorsanız, aşağıdakiler yardımcı olacaktır:

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

Pitonik bir şekilde:

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

0

Bu yanıtı diğer yanıtlardan biri olarak ekliyorum ( https://stackoverflow.com/a/5905752/1904943 ) tarihli (Python 2; iteritems) ve sunulan kod - önerilen Python 3 için güncellenmişse Bu cevaba yapılan bir yorumda geçici çözüm - tüm ilgili verileri sessizce döndüremez.


Arka fon

Bir grafikte (düğümler, kenarlar, ...) temsil edilen bazı metabolik verilerim var. Bu verilerin bir sözlük temsili olarak, anahtarlar formu olan (604, 1037, 0)ile, (kaynak ve hedef düğümleri temsil ve kenar tip) değerleri formunun 5.3.1.9(AK enzimi kodlar temsil eder).

Verilen değerler için anahtar bulma

Aşağıdaki kod, değerlerim verildiğinde anahtarlarımı doğru bir şekilde bulur:

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

oysa bu kod yalnızca ilk (muhtemelen birkaç eşleşen) anahtarı döndürür:

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)

Safça değiştirilmesi güncellenen ikinci kod, iteritemsile items, geri dönmek için başarısız olur (604, 3936, 0), (1037, 3936, 0.


0

Verilere erişmek için şunları yapmanız gerekir:

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

Ya da anahtardan çağırdığınız değere erişmek için: foo[bar]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.