python字典嵌套列表_Python:将几个嵌套的列表组合到一个字典中

本文介绍了如何将[key, list1, list2]数据结构转换为嵌套字典,并展示了如何递归地合并这些字典。提供了两个函数,一个用于转换,另一个用于合并具有相同键的字典,而不会丢失任何数据。" 120272204,442749,使用C语言创建文件路径中的目录,"['C语言', '目录操作', '文件系统']
摘要由CSDN通过智能技术生成

对我来说,把这个问题分成两部分是最有意义的(好吧,我第一次把这个问题读错了…)

转换

第一部分将[key, list1, list2]数据结构转换为嵌套字典:def recdict(elements):

"""Create recursive dictionaries from [k, v1, v2, ...] lists.

>>> import pprint, functools

>>> pprint = functools.partial(pprint.pprint, width=2)

>>> pprint(recdict(['a', ['b', ['x', '1'], ['y', '2']]]))

{'a': {'b': {'x': '1',

'y': '2'}}}

>>> pprint(recdict(['a', ['c', ['xx', '4'], ['gg', ['m', '3']]]]))

{'a': {'c': {'gg': {'m': '3'},

'xx': '4'}}}

"""

def rec(item):

if isinstance(item[1], list):

return [item[0], dict(rec(e) for e in item[1:])]

return item

return dict([rec(elements)])

它希望如此每个列表至少有两个元素

每个列表的第一个元素是一个键

如果列表的第二个元素是列表,那么所有后续元素也都是列表;这些元素被组合到字典中。在

最棘手的一点(至少对我来说)是意识到必须从递归函数返回一个列表,而不是从字典返回。否则,您不能组合构成某些列表的第二和第三个元素的并行列表。在

为了使它更普遍地有用(即元组和其他序列),我将改变

^{2}$

到if (isinstance(item[1], collections.Sequence)

and not isinstance(item[1], basestring)):

你也可以让它为任何iterable工作,但这需要一点重组。在

合并

第二部分合并在两个给定数据结构上运行第一个例程所产生的字典。我认为这将递归地合并没有冲突键的任何数量的字典,尽管除了这个用例之外,我并没有真正测试过它。在def mergedicts(*dicts):

"""Recursively merge an arbitrary number of dictionaries.

>>> import pprint

>>> d1 = {'a': {'b': {'x': '1',

... 'y': '2'}}}

>>> d2 = {'a': {'c': {'gg': {'m': '3'},

... 'xx': '4'}}}

>>> pprint.pprint(mergedicts(d1, d2), width=2)

{'a': {'b': {'x': '1',

'y': '2'},

'c': {'gg': {'m': '3'},

'xx': '4'}}}

"""

keys = set(k for d in dicts for k in d)

def vals(key):

"""Returns all values for `key` in all `dicts`."""

withkey = (d for d in dicts if d.has_key(key))

return [d[key] for d in withkey]

def recurse(*values):

"""Recurse if the values are dictionaries."""

if isinstance(values[0], dict):

return mergedicts(*values)

if len(values) == 1:

return values[0]

raise TypeError("Multiple non-dictionary values for a key.")

return dict((key, recurse(*vals(key))) for key in keys)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值