创建字典的更优雅代码的提示

时间:2019-05-10 12:52:01

标签: python dictionary for-loop

我正在使用列表中的键和值创建字典:

keys = ['Ptot', 'P1', 'P2', 'P3', 'Q1', 'Q2', 'Q3']
val = ['max', 'first', 'first', 'first', 'first', 'first', 'first']

我可以通过以下方式手动创建字典:

dictionary = {'Ptot': 'max', 'P1': 'first', 'P2': 'first', 'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first'}

如何通过for循环从列表中更优雅地创建字典?我的问题是列表的大小比此示例大得多。

3 个答案:

答案 0 :(得分:7)

看看zip

>>> d = dict(zip(keys, val))
>>> d
{'Ptot': 'max', 'P1': 'first', 'P2': 'first', 'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first'}
  

制作一个迭代器,以聚合每个可迭代对象中的元素。

     

返回一个元组的迭代器,其中第i个元组包含每个自变量序列或可迭代对象中的第i个元素。

然后,我们将返回值传递给dict以创建字典。这可能比简单的循环更有效,因为内建函数在Python中以C速度运行,并且实现者可能有更多时间对其进行优化。

答案 1 :(得分:6)

使用字典理解,在迭代时,您可以从keysval列表中选择键和值,如果keys和{ {1}}的长度不相等,您可以通过itertools.zip_longest将它们全部压缩在一起,这将创建最长子序列的迭代器,确保val的长度大于keys ,我们没有可用的键,也许将来可以重新分配(谢谢@quamrana)

val

输出为

from itertools import zip_longest
keys = ['Ptot', 'P1', 'P2', 'P3', 'Q1', 'Q2', 'Q3']
val = ['max', 'first', 'first', 'first', 'first', 'first', 'first']

print({k:v for k,v in zip_longest(keys, val)})

一个比{'Ptot': 'max', 'P1': 'first', 'P2': 'first', 'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first'} keys的长度的示例

val

输出将为

from itertools import zip_longest
keys = ['Ptot', 'P1', 'P2', 'P3', 'Q1', 'Q2', 'Q3', 'QX', 'QY']
val = ['max', 'first', 'first', 'first', 'first', 'first', 'first']

print({k:v for k,v in zip_longest(keys, val)})

因此,我们看到密钥在这里并没有丢失,而是被使用并且将值设置为None,但是使用zip将导致我们丢失那些密钥!

但是,如果我们只想从较小的列表中选择元素,则可以执行以下操作(感谢@MitchelPaulin)

{'Ptot': 'max', 'P1': 'first', 'P2': 'first', 
'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first', 
'QX': None, 'QY': None}

答案 2 :(得分:0)

此方法使用zip并简单地附加第二个列表以匹配大小。

l1=['Ptot', 'P1', 'P2', 'P3', 'Q1', 'Q2', 'Q3', 'Q4' ]
l2=['max', 'first' ]

# make sure we have the same length
for i in range (len(l1)-len(l2)): l2.append(None)

d={}
d={k:v for k,v in zip(l1,l2)}
print(d)

请注意,我像zip_longest使用append(None)一样使用fillvalue=None


{'Ptot': 'max', 'P1': 'first', 'P2': None, 'P3': None, 'Q1': None, 'Q2': None, 'Q3': None, 'Q4': None}