簡體   English   中英

訪問嵌套列表和dicts中的所有元素,無需遞歸

[英]visit all elements in nested lists and dicts without recursion

我有一個由嵌套列表和dicts組成的結構。 我想將函數應用於每個元素。 怎么做沒有遞歸。

def visit(data, func):
    if isinstance(data, dict):
        for k, v in data.items():
            data[k] = visit(v, func)
        return data
    elif isinstance(data, list):
        for i, v in enumerate(data):
            data[i] = visit(v, func)
        return data
    else:
        return func(data)

遞歸版本適用於小數據,但是當數據很大時我遇到了RecursionError異常。

我尋找消除遞歸的一般方法,我發現依賴於首先將遞歸調用轉換為尾調用,我的問題是我的例子中的遞歸調用是在循環內部。

這種方法會起作用。 但是,對於記錄,我同意Sven Marnach的說法,如果您的嵌套符合遞歸限制,那么您的數據結構肯定會出現問題。 如果像Sven推測的那樣,你的數據中有循環,這種方法也會破裂。

data = [1,2, {'a':1, 'b':{'a':[1,2,3]}},3]

def apply(data, f):
    stack = []
    stack.append(data)
    while stack:
        data = stack.pop()
        if isinstance(data, dict):
            for k,v in data.items():
                if isinstance(v, (dict,list)):
                    stack.append(v)
                else:
                    data[k] = f(v)
        if isinstance(data, list):
            for i,e in enumerate(data):
                if isinstance(e, (dict,list)):
                    stack.append(e)
                else:
                    data[i] = f(e)

在解釋器shell中:

$ python -i apply.py
>>> apply(data, lambda x: x + 1)
>>> data
[2, 3, {'a': 2, 'b': {'a': [2, 3, 4]}}, 4]
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM