如何高效将嵌套列表转换为指定键值结构的字典?
高效实现嵌套列表转指定字典的方案
当然有高效又简洁的实现方式啦!针对你这个需求,Python里有几种非常Pythonic的方法,既利用了内置函数的高效性,又能让代码看起来清爽:
方法一:字典推导式 + zip解包
这是最直观也最推荐的方式,一行代码就能搞定:
my_list = [['key1', 'key2'], [1,2], ['a','b']] my_dict = {key: values for key, *values in zip(*my_list)}
原理解释:
zip(*my_list)会把原列表的子列表按索引位置打包,输出两个元组:('key1', 1, 'a')和('key2', 2, 'b')- 字典推导式里,
key, *values用了Python的解包语法,把每个元组的第一个元素取作键,剩下的元素自动组成列表作为对应的值
方法二:dict+zip组合(更简洁)
如果追求极致简洁,可以用dict直接构造,再把值转成列表:
my_dict = {k: list(v) for k, v in zip(my_list[0], zip(*my_list[1:]))}
原理解释:
zip(*my_list[1:])先把除了键列表之外的子列表打包,得到(1, 'a')和(2, 'b')这两个元组- 再用
zip(my_list[0], ...)把键和对应的元组配对,最后通过字典推导式把元组转成列表
为什么这些方法高效?
这些方法都用到了Python内置的zip函数——它是用C语言实现的底层函数,执行速度比纯Python写的循环快得多,尤其是当你的嵌套列表规模很大时,这种内置函数的优势会非常明显。
如果用传统的循环写法(比如逐个索引取值),虽然也能实现,但代码冗余且效率不如上面的方法:
# 不推荐的循环写法(仅作对比) my_dict = {} keys = my_list[0] for idx in range(len(keys)): my_dict[keys[idx]] = [sub[idx] for sub in my_list[1:]]
内容的提问来源于stack exchange,提问作者miweomnwirng
相关产品推荐
相关产品推荐

