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
长度不等,为了安全起见,您可以通过将所有键压缩到一起,这将创建最长子序列的迭代器,确保如果saykeys
比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}