2

我有一个嵌套列表,需要将其转换为分层字典。但是我有点困惑如何以干净的pythonic方式实现它。这是我想出的一个有点难看的示例代码。如何改进它?

from itertools import tee,izip
import json

L=[(1,2,3,4,5),(1,2,7),(2,3,5),(3,4,5,6)]

def pairs(iterable):
    a,b = tee(iterable)
    b.next()
    return izip(a,b)

def innerfunc(pairs,d):
    try:
        pair           = pairs.next()
        item, nextitem = pair        
    except StopIteration:       
        return 
    if item in d:        
        innerfunc(pairs,d[item])
    else:        
        d[item]= {}
        {nextitem : innerfunc(pairs,d[item])}


def outerfunc(matrix):
    result_dict={}
    for row in matrix:        
        iter_pairs = pairs(row+(0,))
        innerfunc(iter_pairs,result_dict)
    return result_dict

print json.dumps(outerfunc(L), sort_keys=True, indent=4)

输出:

{
    "1": {
        "2": {
            "3": {
                "4": {
                    "5": {}
                }
            }, 
            "7": {}
        }
    }, 
    "2": {
        "3": {
            "5": {}
        }
    }, 
    "3": {
        "4": {
            "5": {
                "6": {}
            }
        }
    }
}
4

1 回答 1

2

您可以使用递归非常简洁地做到这一点:

def append_path(root, paths):
    if paths:
        child = root.setdefault(paths[0], {})
        append_path(child, paths[1:])

# Example usage
root = {}
for p in [(1,2,3,4,5),(1,2,7),(2,3,5),(3,4,5,6)]:
    append_path(root, p)

# Print results
import json
print json.dumps(root,  indent=4)

输出:

{
    "1": {
        "2": {
            "3": {
                "4": {
                    "5": {}
                }
            }, 
            "7": {}
        }
    }, 
    "2": {
        "3": {
            "5": {}
        }
    }, 
    "3": {
        "4": {
            "5": {
                "6": {}
            }
        }
    }
}
于 2012-12-13T14:14:45.047 回答