5

ネストされたリストと辞書を繰り返し処理し、16進文字列を介してすべての整数を置き換える必要があります。このような要素は、たとえば次のようになります。

element = {'Request': [16, 2], 'Params': ['Typetext', [16, 2], 2], 'Service': 'Servicetext', 'Responses': [{'State': 'Positive', 'PDU': [80, 2, 0]}, {}]}

関数を適用すると、次のようになります。

element = {'Request': ['0x10', '0x02'], 'Params': ['Typetext', ['0x10', '0x02'], '0x02'], 'Service': 'Servicetext', 'Responses': [{'State': 'Positive', 'PDU': ['0x50', '0x02', '0x00']}, {}]}

このようなネストされた反復可能オブジェクトを反復処理する関数をすでに見つけましたhttp://code.activestate.com/recipes/577982-recursively-walk-python-objects/。Python 2.5に適応すると、この関数は次のようになります。

string_types = (str, unicode)
iteritems = lambda mapping: getattr(mapping, 'iteritems', mapping.items)()

def objwalk(obj, path=(), memo=None):
    if memo is None:
        memo = set()
    iterator = None
    if isinstance(obj, dict):
        iterator = iteritems
    elif isinstance(obj, (list, set)) and not isinstance(obj, string_types):
        iterator = enumerate
    if iterator:
        if id(obj) not in memo:
            memo.add(id(obj))
            for path_component, value in iterator(obj):
                for result in objwalk(value, path + (path_component,), memo):
                    yield result
            memo.remove(id(obj))
    else:
        yield path, obj

ただし、この関数の問題は、タプル要素を返すことです。そして、それらは編集できません。必要な機能の実装を手伝ってもらえますか?

よろしくwewa

4

1 に答える 1

2

この関数はタプル要素を返すだけではありません。ネストされた構造内の任意のアイテムへのパスとその値を返します。そのパスを使用して、値を取得して変更できます。

for path, value in objwalk(element):
    if isinstance(value, int):
        parent = element
        for step in path[:-1]:
            parent = parent[step]
        parent[path[-1]] = hex(value)

したがって、整数であるすべての値について、パスを使用してその値の親を見つけ、現在の値をそれに相当する16進数に置き換えます。

上記のメソッドから得られる出力:

>>> element
{'Params': ['Typetext', ['0x10', '0x2'], '0x2'], 'Request': ['0x10', '0x2'], 'Responses': [{'State': 'Positive', 'PDU': ['0x50', '0x2', '0x0']}, {}], 'Service': 'Servicetext'}
于 2012-07-16T09:19:37.367 に答える