将两个嵌套列表压缩到一个单级字典的最有效方法是什么

2024-10-04 11:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

例如:

list1=['k1','k2','k3',['k4','k5',['k6','k7']]]
list2=['v1','v2','v3',['v4','v5',['v6','v7']]]

我想把它们合并成这样的字典:

^{pr2}$

我有办法做到这一点,但我认为这需要太多时间:

def mergeToDict(keyList, valueList):
    resultDict = {}
    for key, value in itertools.izip(keyList, valueList):
        if type(key) == list and type(value) == list:
            resultDict=dict(resultDict,**mergeToDict(key, value))
        elif type(key) != list and type(key) != dict and type(key) != tuple:
            resultDict[key] = value
    return resultDict

有更好的主意吗?在


Tags: andkeyvaluetypek2k1dictlist
3条回答

flatten定义为:

>>> def flatten(l):
...     r = []
...     for x in l:
...             if isinstance(x, list):
...                     r.extend(flatten(x))
...             else:
...                     r.append(x)
...     return r

dict(zip(flatten(list1), flatten(list2)))似乎和你的一样快。这是一个更方便的方法,正如大家所说。在

我认为你根本不需要扁平化,如果你只有你所展示的那些用例(嵌套列表,但形状相同)。这里有一种方法,在我的机器上至少比你的快2-3倍(同样只适用于这种约束):

def appendDict(list1, list2, resultDict):
    for idx, val in enumerate(list1):
        if isinstance(val, list):       
            appendDict(val, list2[idx], resultDict)
        else:
            resultDict[val] = list2[idx]

list1=['k1','k2','k3',['k4','k5',['k6','k7']]]
list2=['v1','v2','v3',['v4','v5',['v6','v7']]]
resultDict = {}
appendDict(list1, list2, resultDict)
print resultDict

{'k3': 'v3', 'k2': 'v2', 'k1': 'v1', 'k7': 'v7', 'k6': 'v6', 'k5': 'v5', 'k4': 'v4'}

方法比较:

操作方法,10000次运行:0.290050983429

其他建议方法,10000次运行:0.580717086792

这种方法,运行10000次:0.155267000198

也许没有其他解决方案那么优雅,但性能似乎是这里的主要关注点。在

我会使用某种展平函数:

def flatten(it):
    if isinstance(it, str):
        yield it
        return
    try:
        for x in it:
            for y in flatten(x):
                yield y
    except TypeError:
        yield it

现在你可以做了

^{pr2}$

我认为这种方式对读者来说更一般,更透明。在

相关问题 更多 >