2013-03-12 16 views
1

这里我添加了一个代码生成xml_tags的顺序,这是我的输出是什么:不大不小的dictionary-声明它蟒蛇

md5 value = "sdfhsdkjgfjw35378563" 
repOperation value = "push" 
size value = "toolarge" 
images value = "/home/rakesh/from_t_jack/imag1.ipds" 
status value = "completed" 
replication value = "mode" 
sdlist value = "f:" 

我用的字典。我无法得到正确的sort我的字典。我希望按照我声明的顺序对字典进行排序和打印。 另外一个问题是,如果在第6行观察到输出,则输出有点逆转,我期待:mode value = "replication"。但是输出是颠倒的。我不知道为什么它会以这种方式行事。我想知道如何解决这两个问题。这是我的代码。

def generate_tag(name,val): 

    full_tag = ''+name+' value = "'+val+'"' 
    return full_tag 



    def auto_xml(sdList,repOperation,images,status,md5): 


      tags =   {'repOperationTag' :{'repOperation_tag_name':'repOperation' , 
                'repOperation_val'  : repOperation }, 

          'modeTag'    :{'mode_tag_name':'mode' , 
                'mode_val'  : 'replication' }, 


          'imagesTag'  :{'images_tag_name': 'images', 
                'images_val'  : images }, 

          'statusTag'  :{'status_tag_name':'status' , 
                'status_val'  : status}, 

          'sizeTag'   :{'size_tag_name':'size' , 
               'size_val'  : 'toolarge'}, 

          'md5Tag'   :{'md5_tag_name' : 'md5' , 
                'md5_val'   : md5} , 

          'sdListTag'  :{'sdList_tag_name': 'sdlist' , 
                'sdList_val'  : sdList} } 

      count = 0 
      tag_len = len(tags) 

      while count < tag_len : 

       inner = tags[tags.keys()[count]] 

       tag_name = inner[inner.keys()[0]] 
       tag_val = inner[inner.keys()[1]] 

       full_tag = generate_tag(tag_name,tag_val) 

       print full_tag 
       count = count + 1 



    def myordered_dict(): 

     from collections import OrderedDict 


     tags =   {'A_repOperationTag' :{'tag_name':'repOperation' , 
             'tag_val'  : repOperation }, 

       'B_modeTag'    :{'tag_name':'mode' , 
             'tag_val'  : 'replication' }, 


       'C_imagesTag'  :{'tag_name': 'images', 
             'tag_val'  : images }, 

       'D_statusTag'  :{'tag_name':'status' , 
             'tag_val'  : status}, 

       'E_sizeTag'   :{'tag_name':'size' , 
            'tag_val'  : 'toolarge'}, 

       'F_md5Tag'   :{'tag_name' : 'md5' , 
             'tag_val'   : md5} , 

       'G_sdListTag'  :{'tag_name': 'sdlist' , 
             'tag_val'  : sdList}, 

       'H_machinename'  :{'tag_name': 'hostname' , 
             'tag_val'  : 'xp_vm'} } 

     tags = OrderedDict(sorted(tags.items(), key=lambda t: t[0])) 
+2

词典不是有序的。但是有一个叫[ordered dictionaries]的变体(http://docs.python.org/2/library/collections.html#collections.OrderedDict),它可能会做你想做的。 – 2013-03-12 12:15:14

+0

我的输出问题也与在字典中订购有关 – rakesh 2013-03-12 12:22:00

+1

@rakesh - 是的。当你执行'inner.keys()[0]'时,你假定'inner'保持它的插入顺序,而实际上它没有。 – mgilson 2013-03-12 12:23:48

回答

8

dict对象是没有顺序的 - 更确切地说,是一个字典对象的顺序是实现,版本和插入顺序依赖。这并不是说您插入密钥的顺序是您将它们退出的顺序。这只意味着,如果您将相同的密钥插入到两个不同的字典中,但以不同的顺序,则您将返回的顺序不一定保持一致。例如:

>>> print {1:1, 9:2} 
{1: 1, 9: 2} 
>>> print {9:1, 1:2} 
{9: 1, 1: 2} 

这并不意味着键仍然保持其插入顺序。请注意,如果我插入一个关键2到末尾的字典会发生什么:

>>> print {9:1, 1:2, 2:4} 
{9: 1, 2: 4, 1: 2} 
>>> print {1:1, 9:2, 2:4} 
{1: 1, 2: 4, 9: 2} 

这里的另一个answer,我给了一段时间后,其谈论如何(C)蟒蛇决定了你的字典顺序,如果你感兴趣。

如果您需要字典来维护订单,您应该使用collections.OrderedDict

+0

感谢您对“词典”作出清晰的阐述。我会发布我的代码。 – rakesh 2013-03-13 06:40:02