从两个列表创建字典

0 投票
2 回答
1581 浏览
提问于 2025-04-18 02:29

我的任务是:我有两个大小不同的列表,比如一个是(1,2,3,4),另一个是("qwe","asd","zxc")。我想用这两个列表创建一个字典,条件是:如果字典的键的数量超过值的数量,那么就让这个键对应的值为None。如果值的数量更多,就直接忽略这个键。

list1=[1,2,3,4]
list2=["qwe","asd","zxc"]
dictx={}
for x in range(len(list1)):
if x>len(list2):
    dictx[list1[x]]=None
else:
    dictx[list1[x]]=list2[x]

但是我遇到了一个错误:错误追踪(最近的调用最后): 文件 "", 第5行,在 dictx[list1[x]]=list2[x] 索引错误:列表索引超出范围 我在这段代码中哪里出错了?Python 3.4 更新:现在可以运行了,但我想理解我在这段代码中的错误在哪里。有人有什么想法吗?

2 个回答

3

你也可以使用 itertools.izip_longest,用法如下:

import itertools
list1=[1,2,3,4]
list2=["qwe","asd","zxc"]
print ({l1:l2 for l1,l2 in itertools.izip_longest(list1,list2,fillvalue=None)})

编辑:在 Python 3 中:

import itertools
list1=[1,2,3,4]
list2=["qwe","asd","zxc"]
print ({l1:l2 for l1,l2 in itertools.zip_longest(list1,list2,fillvalue=None)})

输出结果:

{1: 'qwe', 2: 'asd', 3: 'zxc', 4: None}
3

None 来填充值列表,使用 itertools.chainitertools.repeat,然后把这些列表合并在一起:

from itertools import chain, repeat

d = dict(zip(list1, chain(list2, repeat(None))))

repeat(None) 是一个无限的迭代器,它会一直输出 None

chain(list2, repeat(None)) 是一个迭代器,它会先输出 list2 中的元素,当 list2 的元素用完后,就开始输出 None

zip(...) 会返回一个包含来自 list1 和填充后的 list2 中对应元素的配对列表。zip 会在任何一个输入用完时停止,所以最终的长度和 list1 一样。

最后,dict(...) 会把这些键值对的列表转换成一个字典,字典中的键对应这些值。

撰写回答