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

Python 创建字典的更优雅代码提示,python,dictionary,for-loop,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':

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

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循环从列表中更优雅地创建dict?我的问题是列表的大小比这个示例大得多。

使用字典理解,在迭代时从
val
列表中选择键和值,如果
val
长度不等,为了安全起见,您可以通过将所有键压缩到一起,这将创建最长子序列的迭代器,确保如果say
keys
val
长,我们没有这些键,也许将来会重新分配它们(感谢@quamrana)

输出为

{'Ptot': 'max', 'P1': 'first', 'P2': 'first', 'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first'}
然后
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)})
输出将是

{'Ptot': 'max', 'P1': 'first', 'P2': 'first', 
'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first', 
'QX': None, 'QY': None}
因此,我们看到这里的键没有丢失,而是被使用,并且值设置为“无”,但是使用将导致我们丢失这些键

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

看看:

制作一个迭代器,聚合来自每个ITerable的元素

返回元组迭代器,其中第i个元组包含每个参数序列或iterables中的第i个元素


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

此方法使用
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)
注意,我使用了
append(None)
与使用
fillvalue=None
类似



它们的大小总是一样吗?
d={}对于zip中的k,v(键,val):d[k]=v
可能需要使用
min(len(键),len(val))
只是为了安全起见,只有当
键和
val
包含相同数量的元素时,这才有效。您可以
zip
键和
vals
一起使用。
from itertools import zip_longest
keys = ['Ptot', 'P1', 'P2', 'P3', 'Q1', 'Q2', 'Q3', 'QX', 'QY']
val = ['max', 'first', 'first', 'first', 'first', 'first', 'first']

#Pick the smaller of the 2 lengths and iterate only on those indexes
length = min(len(keys), len(val))
print({keys[idx]:val[idx] for idx in range(length)})
>>> d = dict(zip(keys, val))
>>> d
{'Ptot': 'max', 'P1': 'first', 'P2': 'first', 'P3': 'first', 'Q1': 'first', 'Q2': 'first', 'Q3': 'first'}
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)
{'Ptot': 'max', 'P1': 'first', 'P2': None, 'P3': None, 'Q1': None, 'Q2': None, 'Q3': None, 'Q4': None}