A mydict
boş değilse, isteğe bağlı bir öğeye şu şekilde erişirim:
mydict[mydict.keys()[0]]
Bunu yapmanın daha iyi bir yolu var mı?
list(mydict.keys())[0]
.
A mydict
boş değilse, isteğe bağlı bir öğeye şu şekilde erişirim:
mydict[mydict.keys()[0]]
Bunu yapmanın daha iyi bir yolu var mı?
list(mydict.keys())[0]
.
Yanıtlar:
Python 3'te, tahribatsız ve tekrarlı olarak:
next(iter(mydict.values()))
Python 2'de, tahribatsız ve tekrarlı olarak:
mydict.itervalues().next()
Hem Python 2 hem de 3'te çalışmasını istiyorsanız, six
paketi kullanabilirsiniz :
six.next(six.itervalues(mydict))
Ancak bu noktada oldukça şifreli ve kodunuzu tercih ederim.
Herhangi bir öğeyi kaldırmak istiyorsanız şunları yapın:
key, value = mydict.popitem()
"İlk" in burada uygun bir terim olmayabileceğini unutmayın, çünkü dict
Python <3.6'da sıralı bir tip değildir. Python 3.6+ dicts
sipariş edilir.
dict.iterkeys().next()
?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
Sadece bir öğeye erişmeniz gerekiyorsa (dikte siparişi garanti etmediğinden, şans eseri ilk olmak), bunu sadece Python 2'de yapabilirsiniz :
my_dict.keys()[0] -> key of "first" element
my_dict.values()[0] -> value of "first" element
my_dict.items()[0] -> (key, value) tuple of "first" element
Lütfen unutmayın (en iyi bildiğim kadarıyla) Python, bu yöntemlerden herhangi birine yapılan 2 ardışık aramanın aynı siparişle liste döndüreceğini garanti etmez. Bu Python3 ile desteklenmez.
içinde Python 3 :
list(my_dict.keys())[0] -> key of "first" element
list(my_dict.values())[0] -> value of "first" element
list(my_dict.items())[0] -> (key, value) tuple of "first" element
list(my_dict.keys())[0]
list(my_dict.keys())[0]
tembel değil mi?
Python3'te, Yol:
dict.keys()
türünde bir değer döndür: dict_keys (), bu şekilde dict anahtarlarının 1. üyesi bu şekilde olduğunda bir hata alırız:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Son olarak, dict.keys () öğesini @ 1 numaralı listeye dönüştürdüm ve liste ekleme yöntemiyle 1. üye aldım:
list(dict.keys())[0]
list(dict.values())[0]
.
Diğerlerinin de belirttiği gibi, sözlüklerin garanti sırası olmadığından (ilk tablo olarak uygulandıklarından) "ilk öğe" yoktur. Örneğin, en küçük anahtara karşılık gelen değer thedict[min(thedict)]
bunu yapar. Anahtarların yerleştirilme sırasına dikkat ederseniz, yani "ilk" ile "en erken eklenen" anlamına gelirseniz, Python 3.1'de koleksiyonları kullanabilirsiniz . Python'un eski sürümleri için, burada bulabileceğiniz sıralı dict backport'u (2.4 ve üstü) indirin, yükleyin ve kullanın .
Python 3.7 Şimdi dikteler ekleme talimatı verildi.
Karar sırasını çevreleyen sorunları görmezden gelmek, daha iyi olabilir:
next(dict.itervalues())
Bu şekilde, öğe aramasından ve kullanmadığımız anahtarların bir listesini oluşturmaktan kaçınırız.
next(iter(dict.values()))
next(iter(dict.values()))
listeyi oluşturmadan aynı sonucu almamız gerekir .
Her zaman şunları yapabilirsiniz:
for k in sorted(d.keys()):
print d[k]
Bu, sıralamanın sizin için bir anlamı varsa, üzerinde işlem yapabileceğiniz tutarlı bir şekilde sıralanmış ( yerleşik .hash () ile ilgili ) bir anahtar kümesi verecektir. Bu, örneğin, sözlüğü genişletseniz bile sayısal türlerin tutarlı bir şekilde sıralandığı anlamına gelir.
MİSAL
# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())
# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())
# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())
Yazdırıldığında sözlüğün sıralandığını unutmayın. Ama anahtar set aslında bir hashmap!
Hem Python 2 hem de 3 için:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
kısa sürede tam olarak cevaplar .
first_key, *rest_keys = mydict
Harici kütüphane yok, hem Python 2.7 hem de 3.x üzerinde çalışıyor:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
Aribtrary anahtarı için .values ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
Alt sınıflandırma dict
etkili olmasa da bir yöntemdir. Burada bir tamsayı verirseniz döndürülür d[list(d)[n]]
, aksi takdirde sözlüğe beklendiği gibi erişin:
class mydict(dict):
def __getitem__(self, value):
if isinstance(value, int):
return self.get(list(self)[value])
else:
return self.get(value)
d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
'e': 'test', 'f': 'dictionary', 'g': 'testing'})
d[0] # 'hello'
d[1] # 'this'
d['c'] # 'is'