我的任务:我有2个不同大小的列表(例如1,2,3,4和“qwe”,“asd”,“zxc”)。如何使用具有下一个条件的列表创建字典:如果键的数量多于值-dict [key] = 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]
但是我发现错误:Traceback(最近一次调用最后一次): 文件“”,第5行,in dictx [list1的[X]] = list2中[X] IndexError:列表索引超出范围 我错在哪里?Python 3.4 Upd.It的工作,但我试着理解我在这段代码中的错误。有谁想过?
答案 0 :(得分: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}
答案 1 :(得分:2)
使用itertools.chain
和itertools.repeat
使用None
填充值列表,然后压缩列表:
from itertools import chain, repeat
d = dict(zip(list1, chain(list2, repeat(None))))
repeat(None)
是一个永久产生None
的无限迭代器。
chain(list2, repeat(None))
是一个迭代器,可以从list2
生成项目,然后在None
用完时生成list2
。
zip(...)
会返回list1
和填充list2
对应元素对的列表。当任何输入用完时zip
停止,因此输入与list1
一样长。
最后,dict(...)
获取键值对列表,并使用与这些值对应的键创建一个dict。