python - 遍历嵌套列表和字典

标签 python loops

我需要遍历嵌套列表和字典,并通过十六进制字符串替换每个整数。例如,这样的元素可能如下所示:

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

但是这个函数的问题是,它返回元组元素。那些不能被编辑。 你能帮我实现一个我需要的功能吗?

最好的问候 哇哇

最佳答案

该函数不仅返回元组元素;它返回嵌套结构中任何项目的路径,加上它的值。您可以使用该路径获取值并更改它:

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

关于python - 遍历嵌套列表和字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501090/

相关文章:

python - 如何在 socket.io python 服务器中获取连接客户端的 session ID?

python - flask 和 python 是否存在类似 CanCan(授权库)的东西

python - 根据特定标准从图像中选择坐标

python - 一维卷积层之后的最大池化层

python - 从python中的列表和字典的复杂列表中提取元素

loops - 按修改日期而不是发布日期对 Jekyll 帖子进行排序?

c++ - 程序不等待 cin

java - 为什么这个 for 循环在 java 中不起作用?

arrays - Perl:对数组使用条件

java - 如何打破java中的if循环