1

ここにxml_tagsを生成するコードを追加しました。これが私の出力です:

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辞書を正しく理解できません。宣言した順序で辞書を並べ替えて印刷したい。もう1つの問題は、出力が6行目で観察された場合、出力が少し逆になっていることですmode value = "replication"。しかし、出力が逆になります。なぜこのように動作しているのかわかりません。私はこれらの2つの問題を修正する方法を考えていました。これが私のコードです。

  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]))
4

1 に答える 1

8

dictオブジェクトは順序付けられていません-より正確には、dictオブジェクトの順序は、実装、バージョン、および挿入の順序に依存します。これは、キーを挿入する順序が、キーを元に戻す順序であるということではありません。これは、同じキーを2つの異なる辞書に挿入したが、順序が異なる場合に、それらを元に戻す順序が同じであるとは限らないことを意味するだけです。例えば:

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

ただし、これは、キーが挿入順序を維持していることを意味するものではありません。2最後にdictにキーを挿入するとどうなるかに注意してください。

>>> 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}

興味がある場合、(C)pythonが辞書の順序をどのように決定するかについて話している、私がしばらく前に与えた別の答えがあります。

順序を維持するためにdictが必要な場合は、を使用する必要がありますcollections.OrderedDict

于 2013-03-12T12:14:33.537 に答える