从2个列表创建字典

时间:2014-04-12 12:53:12

标签: python python-3.x dictionary

我的任务:我有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的工作,但我试着理解我在这段代码中的错误。有谁想过?

2 个答案:

答案 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.chainitertools.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。