Jika mydict
tidak kosong, saya mengakses elemen seperti:
mydict[mydict.keys()[0]]
Apakah ada cara yang lebih baik untuk melakukan hal ini?
Pada Python 3, non-destruktif dan iteratif:
next(iter(mydict.values()))
Pada Python 2, non-destruktif dan iteratif:
mydict.itervalues().next()
Jika anda ingin bekerja di kedua Python 2 dan 3, anda dapat menggunakan enam
paket:
six.next(six.itervalues(mydict))
meskipun pada saat ini sangat samar dan I'd lebih memilih kode anda.
Jika anda ingin menghapus item apapun, lakukan:
key, value = mydict.popitem()
Perhatikan bahwa "lebih" ini bukan merupakan istilah yang tepat di sini. Ini adalah "salah" item, karena dict
tidak memerintahkan jenis.
Jika anda hanya perlu mengakses satu elemen (yang pertama secara kebetulan, sejak dicts tidak menjamin pemesanan) anda hanya dapat melakukan ini di Python 2:
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
Harap dicatat bahwa (yang terbaik dari pengetahuan saya) Python tidak menjamin bahwa 2 berturut-turut panggilan untuk setiap metode ini akan mengembalikan daftar yang sama dengan pemesanan. Hal ini tidak didukung dengan Python3.
di 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
Di python3, Dengan cara :
dict.keys()
mengembalikan nilai dalam tipe : dict_keys(), kita'll punya kesalahan ketika mendapat 1 anggota kunci dari dict dengan cara ini:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Akhirnya, saya mengubah dict.kunci-kunci() daftar @1, dan ada 1 anggota dengan daftar sambatan metode:
list(dict.keys())[0]
next(iter(mydict))
next(iter(mydict.values()))
next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2
Dua yang pertama adalah Python 2 dan 3. Dua yang terakhir adalah malas di Python 3, tapi tidak di Python 2.
Seperti orang-orang lain yang disebutkan, tidak ada "item", karena kamus yang tidak memiliki jaminan pesanan (mereka're diimplementasikan sebagai tabel hash). Jika anda ingin, misalnya, nilai yang sesuai dengan yang terkecil kunci, thedict[min(thedict)]
akan melakukan itu. Jika anda peduli tentang urutan di mana kunci yang dimasukkan, yaitu, "lebih" anda berarti "dimasukkan paling awal", kemudian di Python 3.1 anda dapat menggunakan koleksi.OrderedDict, yang juga di masa yang akan datang Python 2.7; untuk versi Python, men-download, menginstal, dan menggunakan memerintahkan dict backport (2.4 dan yang lebih baru) yang dapat anda temukan di sini.
Python 3.7 Now dicts adalah penyisipan pesan.
Mengabaikan isu-isu seputar dict memesan, ini mungkin lebih baik:
next(dict.itervalues())
Ini cara kita menghindari item lookup dan menghasilkan daftar kunci yang kita don't digunakan.
next(iter(dict.values()))
Anda selalu dapat melakukan:
for k in sorted(d.keys()):
print d[k]
Ini akan memberikan anda secara konsisten diurutkan (sehubungan dengan builtin.hash() saya kira) set kunci anda dapat memproses jika pemilahan memiliki arti apapun untuk anda. Itu berarti misalnya numerik jenis diurutkan secara konsisten bahkan jika anda memperluas kamus.
CONTOH
# 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())
Perhatikan bahwa kamus adalah diurutkan ketika dicetak. Tapi kunci set pada dasarnya adalah sebuah hashmap!
Update dari @swK's jawaban, berdasarkan @alldayremix' komentar:
Di Python 3 menggunakan:
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
first_key, *rest_keys = mydict
Subclassing dict
merupakan salah satu metode, meskipun tidak efisien. Di sini jika anda pasokan integer itu akan kembali d[daftar(d)[n]]
, jika tidak mengakses kamus seperti yang diharapkan:
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'