2016-04-05 22 views
-5

: ['apple','banana','orange','pear']: bir operasyon yani my_dict.keys() veya my_dict.iterkeys() yapılır anahtarlarını almak için iseAynı zamanda siparişi iptal edilen anahtarlar mı sipariş veriliyor? Örneğin

my_dict = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

, geri dönmek için garantili?

Bu, belgelerde açıkça belirtilmemiştir.

+0

Evet. "OrderedDict - sipariş girişlerini hatırlayan dict alt sınıfı eklendi" – AndreyT

+0

@AndreyT Öğeleri bildiğimi veya yinelemediğim soru, özellikle .keys() veya .values ​​() yöntemleri hakkında – DhruvPathak

+4

@ DhruvPathak: ve ne düşünüyorsun? olmayacaklar mı? anahtar/değer çiftleri girişlerdir. Anahtarların üzerinde yineleme, değerler veya öğeler aynı siparişi kullanmak zorundadır. Durum böyle değilse * çok * şaşırtıcıdır ve bir istisna olarak açık bir şekilde belgelenmelidir. Dokümantasyonda böyle bir istisna yoktur. –

cevap

3

Evet, tüm yinelemeleri aynı siparişi kullanmak için garanti edilir.

Yapmadılarsa, bu, açıkça belgelendirilmesi gereken çok büyük bir istisna olurdu. Belgeler böyle istisnalar içermez.

Her zaman modül belgelerinin en üstünden bağlantılı olarak implementation'u kontrol edebilirsiniz. Tüm yöntem uygulamalarının, self üzerinden yinelemeyi doğrudan veya iter(self) veya list(self) aracılığıyla kullandığını unutmayın; Tüm bu sırada anahtarları üreten OrderedDict.__iter__ yöntem ile beslenir: Örneğin

def __iter__(self): 
    'od.__iter__() <==> iter(od)' 
    # Traverse the linked list in order. 
    root = self.__root 
    curr = root[1]         # start at the first node 
    while curr is not root: 
     yield curr[2]        # yield the curr[KEY] 
     curr = curr[1]        # move to next node 

, OrderedDict.values() yöntem değerlerine eşlemek için bu anahtar kullanır:

def values(self): 
    'od.values() -> list of values in od' 
    return [self[key] for key in self] 
1

Evet OrderedDict anahtarları döndürür sırayla. Bununla birlikte, biraz şaşırtıcı olan the keys views compare order insensitive'dan bahsetmeye değer.

def __iter__(self): 
    'od.__iter__() <==> iter(od)' 
    # Traverse the linked list in order. 
    root = self.__root 
    curr = root[1]         # start at the first node 
    while curr is not root: 
     yield curr[2]        # yield the curr[KEY] 
     curr = curr[1]        # move to next node 

self.__root sadece liste burada: Burada

.keys ve .iterkeys yöntemlerin her ikisi için devredeceğini __iter__ 2,7 reference python implementation vardır.

Not: gerçek uygulama C kodu.

+0

Bir C göremiyorum Python 2'deki OrderedDict için uygulama. Sadece Python 3'ün hızlandırılmış bir versiyonu vardır. –

0

Kısa cevap: evet

Uzun cevap: "sırayla bağlantılı liste Traverse"

tuşları (ve ayrıca değerler) yöntemi __iter__ yöntemine dayanmaktadır uygulanması

def keys(self): 
     return list(self) 

    def values(self): 
     return [self[key] for key in self] 

Sen documentation bağlantılı source code kontrol edebilirsiniz:

İlgili konular