0

次のようなリストがあるとしますが、深さと複雑さは異なる場合があります。

inc = {'root': 10, 
    'values': {
         'left': {8: {
             'left': {
                 6: {
                    'left': 5, 
                    'right': 11}
                  }, 
             'right': {
                  10: {
                     'left': 2, 
                     'right': 11}
               }}}, 
         'right' : {
                  12: {
                     'left': 5, 
                     'right': 20}
                  }}}

私がする必要があるのは、それをトラバースし、左の最小値と左端の値 (つまり、辞書の「左」要素にアクセスすることによって到達する値) を見つけて、それらを交換することです。辞書を再帰的に走査して値を見つけることは問題ではありません。問題は、何を変更する必要があるかを判断した後で、必要な値を見つけることです。

反復に使用される関数:

leftmost = 0
lowest = 0

def walk_dict(d):
    global leftmost, lowest

    for k,v in sorted(d.items()):
        if isinstance(v, dict):
            walk_dict(v)
        else:
            if k == 'left':
                if leftmost == 0:
                    leftmost = v
                if v < lowest:
                    lowest = v
4

1 に答える 1

1

値を直接保持する代わりに、それらを保持する辞書を保持して、最後に値を交換できるようにします。次に例を示します。

[in the loop]
  if k == 'left':
    if not leftmost:
      leftmost = d
    if v < lowest['left']:
      lowest = d

# swap
lefmost['left'], lowest['left'] = lowest['left'], lefmost['left']

また、 leftmostの定義についてはわかりませんが、「左」に等しい最も深いキーを意味する場合、深さ優先のトラバーサル中に見つかった最初の値を単に取得するため、コードは間違っています。この問題を解決するには、現在の深度を保持し、それを比較して、一番左の値を上書きする必要があるかどうかを判断します。

于 2013-03-22T22:46:27.333 に答える