Sözlükteki ilk anahtarı nasıl buluyorsunuz?


203

Programımı "banana"sözlükten yazdırmaya çalışıyorum . Bunu yapmanın en basit yolu ne olurdu?

Bu benim sözlüğüm:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
Python'daki sözlükler sıralanmamıştır, bu nedenle "ilk anahtar" yoktur. Buraya bakın
David Robinson

2
Kelimenin tam anlamıyla "muz" kelimesini veya "muz" ile ilişkili değeri (bu durumda 4) yazdırmak ister misiniz?
Paul H

to print out banana with a FOR loop, so when I run it, each key would also be printed outBunu mu demek istediniz for k in prices: print k? Bu, sözlükteki tüm anahtarları yazdırır.
David Robinson


8
İlk yoruma: python 3.6+ sözlüklerde sipariş verildi (bkz. stackoverflow.com/questions/39980323/… )
Egirus Ornila

Yanıtlar:


289

Dicts'in gerçekten sipariş edildiği bir Python sürümünde şunları yapabilirsiniz:

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

Dicts'in sipariş edilmesi için, Python 3.6'daki dicts'in teknik olarak bir uygulama detayı sipariş edilen doğasına güvenmeye hazırsanız Python 3.7+ veya 3.6+'ya ihtiyacınız var.

Önceki Python sürümleri için "ilk anahtar" yoktur.


31
Python 3'te hem anahtar hem de değer istiyorsanız:next(iter( my_dict.items() ))
Jonathan H

@RyanHaining Python dikteleri, CPython 3.6 ve Python 3.7
Boris

1
Bu cevap için kesme noktasına almak için 6 saat bekledi benim hata ayıklama oturumu berbat. Bu çok can sıkıcı.
Michael

133

Sözlük dizine eklenmez, ancak bir şekilde sıralanır. Aşağıdakiler size mevcut ilk anahtarı verecektir:

list(my_dict.keys())[0]

26
list(my_dict)[0]Anahtar listesini yine de alacağından , bu sadece koymak daha kolay olmaz mıydı?
Jean-Francois T.

@ Jean-FrancoisT. evet
Ryan Haining

Sözlükler şimdi Python 3.7 ile başlayan CPython 3.6 ve diğer tüm Python uygulamalarda sıralanır
Boris

53

Güncelleme: Python 3.7'den itibaren ekleme talimatı korunur, bu yüzden OrderedDictburada ihtiyacınız yoktur . Aşağıdaki yaklaşımları normaldict

Sürüm 3.7'de değiştirildi: Sözlük siparişinin kampanya siparişi olması garanti edilir. Bu davranış, 3.6'dan CPython'un bir uygulama ayrıntısıydı.

kaynak


Python 3.6 ve öncesi *

Eğer bir düzenli hakkında konuşuyorsanız dict, "ilk anahtar" hiçbir şey ifade etmez. Anahtarlar, güvenebileceğiniz herhangi bir şekilde sıralanmamıştır. Eğer sizin için yinelerseniz dict, muhtemelen "banana"ilk gördüğünüz şey olarak alamazsınız.

İşleri düzenli tutmanız gerekiyorsa, OrderedDictyalnızca düz bir sözlük değil , bir de kullanmanız gerekir .

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

Daha sonra tüm anahtarları sırayla görmek isterseniz, yineleyerek

for k in prices:
    print(k)

Alternatif olarak, tüm anahtarları bir listeye koyabilir ve daha sonra bununla çalışabilirsiniz.

ks = list(prices)
print(ks[0]) # will print "banana"

Liste oluşturmadan ilk öğeyi almanın daha hızlı bir yolu next, yineleyiciyi çağırmak olacaktır . Bu, nthöğeyi almaya çalışırken iyi bir şekilde genelleşmiyor

>>> next(iter(prices))
'banana'

* CPython, 3.6'da uygulama ayrıntısı olarak ekleme talimatını garanti etmişti.


Tavsiye için teşekkürler. Daha açık olmadığım için üzgünüm. Ben sadece "Banana" onunla ilişkili değeri DEĞİL yazdırmak sağlayacak kodu bulmaya çalışıyorum. Tüm girdiler için teşekkürler!
slagoy

33

Aşağıdaki Python 3 için liste dönüştürme yükünü ortadan kaldırır:

first = next(iter(prices.values()))

10

dictTürü, bir sırasız yüzden "ilk" eleman diye bir şey yoktur, haritalama.

Ne istiyorsun muhtemelen collections.OrderedDict.


ya da adlandırılmış bir dizi belki de değişmezse
Joran Beasley

Bu Python 3.6'dan itibaren değişti. Sözlükler şimdi sıralanmıştır.
misantroop

1
Teknik olarak, sözlük anahtarlarının ilk elemanından eminseniz, sadece bir anahtar var.
DBX12

bir kişi, sabit olan bir dikte üzerinde tekrarlarken ilk öğeyi söyleyebilirdi. Ama bunu çözmede iyi şanslar.
demongolem

6

Bu yüzden, bilinen uzunluğu 1 olan bir sözlükteki tek anahtarı alıp yalnızca anahtarı döndürmek için bir şeyi optimize etmeye çalışırken bu sayfayı buldum. Aşağıdaki süreç, 700 boyuta kadar denediğim tüm sözlükler için en hızlıydı.

7 farklı yaklaşımı denedim ve Python 3.6 ile 2014 Macbook'umda bunun en iyisi olduğunu gördüm:

def first_5():
    for key in biased_dict:
        return key

Onları profillemenin sonuçları:

  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

Denediğim tüm yaklaşımlar burada:

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

1
Yani bir for döngüsü yapmak ve ilk anahtar (first_5) dönmek aslında görebildiğim kadar hızlı? Ayrıca farklı yaklaşımların güzel bir karşılaştırması.
PiMathCLanguage

1
Evet ve sadece en hızlı değil, aynı zamanda bir ülke miline göre en hızlı. Ayrıca rahatça okumak için en kolay.
turiyag

4

Basit, bana göre cevap

first = list(prices)[0]

sözlüğü listeye dönüştürmek anahtarların çıktısını alır ve listeden ilk anahtarı seçeriz.


Python3 için, sadece ilk elemanını almak için tamamen yeni bir liste oluşturmaya gerek yoktur. next(iter(prices))Diğer cevapların önerdiği gibi daha iyi kullanım .
normanius

1

Diğerlerinin işaret ettiği gibi, sözlükte ilk değer yoktur. İçindeki sıralama isteğe bağlıdır ve sözlüğe her eriştiğinizde sıralama aynı olamaz. Ancak anahtarları orada yazdırmak istiyorsanız birkaç yol var:

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

Bu yöntem, anahtara ve değere erişmek için grup ataması kullanır. Herhangi bir nedenle hem anahtar hem de değere erişmeniz gerekiyorsa bu kullanışlı.

for key in prices.keys():
    print(key)

Bu, yalnızca keys()yöntemin belirttiği gibi anahtarlara erişim sağlar .


1

d.keys () [0] tuşunu tek tek alabilirsiniz.

Güncelleme: - @AlejoBernardin, neden işe yaramadığını söylediğinden emin değilim. burada kontrol ettim ve işe yaradı. koleksiyonları içe aktar

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'muz'


Oy sayısına göre, bu neden en iyi çözüm değil?
GuSuku

18
Bu python2'de çalışır, ancak python3'te çalışmaz. Python3'te, dizin oluşturmayı desteklemeyen dict.keys()a 'dict_keys' objectyerine bir döndürür list.
mavix

TypeError: 'dict_keys' nesnesi indekslemeyi desteklemiyor
anilbey

0

Aşağıdaki tüm anahtarlar arasında değişen bir for döngüsü kullanın prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

Emin değiştirmek olun prices.items()için prices.iteritems()Python 2.x kullanıyorsanız


0

Bir sözlükten sadece ilk anahtarı istiyorsanız, daha önce önerilenlerin çoğunu kullanmalısınız.

first = next(iter(prices))

Ancak birincisini istiyorsanız ve gerisini bir liste olarak saklıyorsanız, değerleri açma operatörünü kullanabilirsiniz

first, *rest = prices

Aynısı prices, prices.values()hem anahtar hem de değer ile değiştirerek değerler için de geçerlidir ve ambalaj açma atamasını bile kullanabilirsiniz

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

Not:first, *_ = prices Sadece ilk anahtarı almak için kullanmak cazip gelebilir , ancak sözlük çok kısa olmadığı sürece genel olarak bu kullanıma karşı tavsiye ederim, çünkü tüm tuşların üzerinden geçer ve restbazı ek yükleri içeren bir liste oluşturur .

Not: Başkaları tarafından belirtildiği gibi, ekleme talimatı python 3.7 (veya teknik olarak 3.6) ve üzeri değerlerden korunurken, daha önceki uygulamalar tanımlanmamış düzen olarak kabul edilmelidir.


-3

en kolay yol:

first_key = my_dict.keys()[0]

ancak bazen daha dikkatli olmanız ve kuruluşunuzun değerli bir liste olduğundan emin olmanız gerekir:

first_key = list(my_dict.keys())[0]

3
Bu yükseltir TypeError: 'dict_keys' object is not subscriptablePython 3.8 ile en azından
Eerik Sven Puudist
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.