如何从列表列表中创建字典

问题描述 投票:2回答:2

这就是我在做的事情:

数据是[[int1, int2, int3], [int1, int2,int3]]形式的列表列表。

我想要一本类似的字典:{int1: [int2, int3], in2:[int2, int3]}。我在字典理解之前检查数据的大小是什么,它是1417。

然后我检查字典的长度是什么,它是11,我不知道数据列表发生了什么,因为所有的元素都没有被复制到containsBacon

def makeComprehension(data):
    containsBacon = dict([(movies[2], movies[0:2]) for movies in data])
python dictionary-comprehension
2个回答
0
投票

这是一种方法:

>>> l = [[1,2,3], [10,20,30]]
>>> d = {m[0]:m[1:] for m in l}
>>> d
{1: [2, 3], 10: [20, 30]}

请注意,并非所有元素都在结果字典中,因为如果两个列表以相同的元素开头,则会创建相同的键,因此不会出现。

如果要在结果字典中包含所有原始元素,可以执行以下操作:

>>> l = [[1,2,3], [10,20,30], [1,5,6]
>>> {m[0]:[x for n in l if n[0]==m[0] for x in n[1:]] for m in l}
{1: [2, 3, 5, 6], 10: [20, 30]}

0
投票

类似于@DevShark的回答,但是有了解构赋值:

>>> L = [[1,2,3], [10,20,30], [1,5,6]]
>>> {k:v for k,*v in L}
{1: [5, 6], 10: [20, 30]}

如果要连接给定键的值,请不要使用dict理解:

>>> d = {}
>>> for k,*v in L: d.setdefault(k, []).extend(v)
...
>>> d
{1: [2, 3, 5, 6], 10: [20, 30]}

setdefault方法创建d[k]条目并将其设置为空列表(如果它不存在)。在@DevShark答案中,该解决方案是O(n)vs O(n ^ 2)。

这是另一个O(n)版本:

>>> import functools
>>> functools.reduce(lambda d,m:{**d, m[0]:d.get(m[0], []) + m[1:]}, L, {})
{1: [2, 3, 5, 6], 10: [20, 30]}

d[m[0]]更新为其之前的值+ m[1:]

如果你想要一个字典理解,你可以使用itertools.groupby作为O(n lg n)解决方案:

>>> import itertools
>>> L.sort() # O(n lg n) part
>>> L
[[1, 2, 3], [1, 5, 6], [10, 20, 30]]
{k:[v for m in ms for v in m[1:]] for k, ms in itertools.groupby(L, lambda m:m[0])}
{1: [2, 3, 5, 6], 10: [20, 30]}
© www.soinside.com 2019 - 2024. All rights reserved.