Python 如何将多个列表映射到一个词典?

Python 如何将多个列表映射到一个词典?,python,list,dictionary,Python,List,Dictionary,我使用了以下代码: dictionary = dict(zip(list1, list2)) 为了映射字典中的两个列表。其中: list1 = ('a','b','c') list2 = ('1','2','3') 该词典相当于: {'a': 1, 'c': 3, 'b': 2} 有没有办法添加第三个列表: list3 = ('4','5','6') 因此,字典将等于: {'a': [1,4], 'c': [3,5], 'b': [2,6]} 必须添加第三个列表,以便遵循现有映射 其思

我使用了以下代码:

dictionary = dict(zip(list1, list2))
为了映射字典中的两个列表。其中:

list1 = ('a','b','c')
list2 = ('1','2','3')
该词典相当于:

{'a': 1, 'c': 3, 'b': 2}
有没有办法添加第三个列表:

list3 = ('4','5','6')
因此,字典将等于:

{'a': [1,4], 'c': [3,5], 'b': [2,6]}
必须添加第三个列表,以便遵循现有映射

其思想是在for循环中迭代执行此操作,并将几十个值映射到正确映射的关键字。 这样的事情可能吗

In [12]: list1 = ('a','b','c')

In [13]: list2 = ('1','2','3')

In [14]: list3 = ('4','5','6')

In [15]: zip(list2, list3)
Out[15]: [('1', '4'), ('2', '5'), ('3', '6')]

In [16]: dict(zip(list1, zip(list2, list3)))
Out[16]: {'a': ('1', '4'), 'b': ('2', '5'), 'c': ('3', '6')}

In [17]: dict(zip(list1, zip(map(int, list2), map(int, list3))))
Out[17]: {'a': (1, 4), 'b': (2, 5), 'c': (3, 6)}

In [18]: dict(zip(list1, map(list, zip(map(int, list2), map(int, list3)))))
Out[18]: {'a': [1, 4], 'b': [2, 5], 'c': [3, 6]}
对于任意数量的列表,可以执行以下操作:

dict(zip(list1, zip(*(map(int, lst) for lst in (list2, list3, list4, ...)))))
或者,要创建值列表而不是元组

dict(zip(list1, map(list, zip(*(map(int, lst) for lst in (list2, list3, list4, ...))))))
会有用的。或者,如果您喜欢稍微好一点的字典理解语法:

{z[0]: list(z[1:]) for z in zip(list1, list2, list3)}
这可以轻松地扩展到任意数量的列表:

list_of_lists = [list1, list2, list3, ...]
{z[0]: list(z[1:]) for z in zip(*list_of_lists)} 
如果要转换类型以确保值列表包含所有整数:

def to_int(iterable):
    return [int(x) for x in iterable]

{z[0]: to_int(z[1:]) for z in zip(*list_of_lists)}

当然,您可以在一行中完成,但我不希望。

是否可以修改类似的内容,使其适用于n个列表?+1。我喜欢dict(zip(键,zip(值))版本。特别是在python3.x上,
zip
是惰性的。请注意,您的输入是元组,而不是列表,但在本例中它们实际上是相同的。列表使用方括号,元组使用圆括号。
'c':[3,5],'b':[2,6]
——这些数字的顺序不正确吗?它们不应该是
'c':[3,6],'b':[2,5]
?另外,FWIW,dicts是无序的,所以如果它更容易阅读,我建议:
{'a':[1,4],'b':[2,5],'c':[3,6]}
IMO,使用iterable解包阅读它更容易:
{k:list(t)for k,*t in-zip(list1,list2,list3)}
。那么嵌套的comp就没那么糟糕了:
{k:[int(x)for x in t]for k,*t in zip(*list of u list)}
。或者您可以使用map:
{k:list(map(int,t))表示k,*t在zip中(*list\u of\u list)}
def to_int(iterable):
    return [int(x) for x in iterable]

{z[0]: to_int(z[1:]) for z in zip(*list_of_lists)}