从两个列表创建字典
我的任务是:我有两个大小不同的列表,比如一个是(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.chain
和 itertools.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(...)
会把这些键值对的列表转换成一个字典,字典中的键对应这些值。