遍历嵌套的列表和字典

5
我需要遍历嵌套的列表和字典,并将每个整数替换为十六进制字符串。例如,这样的元素可能如下所示:
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

相关:https://dev59.com/Y2bWa4cB1Zd3GeqPTyqR - wewa
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)

因此,对于每个整数值,请使用路径查找该值的父级,然后将当前值替换为其十六进制等效项。

从上述方法获得的输出:

>>> element
{'Params': ['Typetext', ['0x10', '0x2'], '0x2'], 'Request': ['0x10', '0x2'], 'Responses': [{'State': 'Positive', 'PDU': ['0x50', '0x2', '0x0']}, {}], 'Service': 'Servicetext'}

你知道如何解决这个问题吗:https://dev59.com/Y2bWa4cB1Zd3GeqPTyqR? - wewa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接