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

时间:2016-02-26 05:59:45

标签: python dictionary-comprehension

这就是我在做的事情:

其中数据是[[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])

2 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:0)

类似于@DevShark的答案,但具有销毁结构:

public static void Run([TimerTrigger("0 */5 * * * *", RunOnStartup = IS_DEBUG)])

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

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

>>> d = {} >>> for k,*v in L: d.setdefault(k, []).extend(v) ... >>> d {1: [2, 3, 5, 6], 10: [20, 30]} 方法将创建setdefault条目,并将其设置为空列表(如果不存在)。 这个解决方案是@DevShark答案中的O(n)vs O(n ^ 2)。

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

d[k]

>>> 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:]用于O(n lg n)解决方案:

itertools.groupby