python - 遍历嵌套列表、元组和字典

标签 python loops

我对 Iterate over nested lists and dictionaries 的主题还有一个问题.

我需要对上面链接的主题进行一些扩展功能。可迭代元素现在还包含元组。元组中的整数也需要转换为十六进制字符串。因此,我尝试使用以下代码将元组转换为列表。

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

但我的问题是,元组中的元组没有被转换。如何以优雅的方式将“子元组”转换为列表?

最好的问候 维瓦

PS:我创建了一个新的主题,因为另一个主题是固定的。

最佳答案

在这种情况下,直接在objwalk 结构遍历器中处理元组会更容易。这是一个修改后的版本,它在遍历元组以查找嵌套元素之前将元组转换为列表:

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):
                if isinstance(value, tuple):
                    obj[path_component] = value = list(value)
                for result in objwalk(value, path + (path_component,), memo):
                    yield result
            memo.remove(id(obj))
    else:
        yield path, obj

使用你之前问题中的一个稍微修改过的例子,以及我在那个问题中给你的相同的 hex 解决方案:

>>> element = {'Request': (16, 2), 'Params': ('Typetext', [16, 2], 2), 'Service': 'Servicetext', 'Responses': ({'State': 'Positive', 'PDU': [80, 2, 0]}, {})}
>>> 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/11505304/

相关文章:

python - cap.isOpened() : returns false in CentOS for Python 3 and OpenCV 3. 1.0

javascript - 解释一下这个函数如何去除负值

C++ - unordered_map 运算符 [],意外行为

C语言改变数组中元素的值

c++ - 向后迭代

python - 在 Python pandas DataFrame 中交换值以清理数据的最佳方法是什么

python - 如何计算十列与极坐标之间的相关性

python - 将输入提供给 Pytorch LSTM 网络时出现 AttributeError : 'tuple' object has no attribute 'dim' ,

python - Pypi 注册和更新

c++ - 在 Arduino 中制作更好的循环