2016-11-25 69 views
1

我是python的新手。 我想用我自己的一些方法制作字典集合。這個問題是兩部分:Python:有序詞典集合的子類或元類

  1. 我應該使用一個列表或字典作爲此容器的模板?
  2. 我該如何實施?我已經閱讀堆棧溢出各個答案此使用collection.MutableSequence或列表提示,所希望的數據結構

    ordered_set_of_dictionaries = 
    { 
        "dictionary_1" : { 
             "key_1": value_1, 
             "key_2": value_2, 
             <etc> 
            }, 
        "dictionary_2" : { 
             "key_1": value_1, 
             "key_2": value_2, 
             <etc> 
            }, 
        "dictionary_3" : { 
             "key_1": value_1, 
             "key_2": value_2, 
             <etc> 
            }, 
        <etc> 
    
    } 
    

    ordered_set_of_dictionaries.last()

    的等

    class OrderedSetOfDictionaries(<something>): 
        def __init__(self, **kwargs): 
        <maybe super().__init__()> 
    
        <do I have to redefine methods if I do not wish to change their behavior> 
    

實施例 - ><dictionary_n>

ordered_set_of_dictionaries["dictionary_1"]["key_1"]

- >value_1

+0

子類化內置類型很少需要。我建議你寫一個包含任何屬性列表的類:比較喜歡聚合到繼承。 – khelwood

+0

你想達到的一個例子會有幫助 – Alex

回答

2

這裏是通過繼承OrderedDict做到這一點的方法之一。以及last()函數我還添加了first()ith(i)函數。 ith(i)的操作與列表索引類似。

from collections import OrderedDict 

class ord_dict_with_indexing(OrderedDict): 
    def __init__(self, *args): 
     super(ord_dict_with_indexing, self).__init__(*args) 

    def ith(self, i): 
     return self.__getitem__(list(self.keys())[i]) 

    def last(self): 
     return self.ith(-1) 

    def first(self): 
     return self.ith(0) 

例如:

d = ord_dict_with_indexing() 
d["dictionary_1"] = {"key_1":"value_1","key_2":"value_2"} 
d["dictionary_2"] = {"key_3":"value_3","key_4":"value_4"} 
d["dictionary_3"] = {"key_5":"value_1","key_2":"value_5"} 

>>> d.first() 
{'key_1': 'value_1', 'key_2': 'value_2'} 
>>> d.last() 
{'key_2': 'value_5', 'key_5': 'value_1'} 
>>> d.ith(1) 
{'key_3': 'value_3', 'key_4': 'value_4'} 
>>> d['dictionary_1']['key_1'] 
'value_1' 

注意,爲了將出現在這些元素的添加順序。