Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据列表列表制作词典_Python_Dictionary Comprehension - Fatal编程技术网

Python 如何根据列表列表制作词典

Python 如何根据列表列表制作词典,python,dictionary-comprehension,Python,Dictionary Comprehension,这就是我正在做的: 其中,数据是一个列表列表,其形式为[[int1,int2,int3],[int1,int2,int3]] 我想要一个如下的字典:{int1:[int2,int3],in2:[int2,int3]}。 在理解词典之前,我正在检查数据的大小,它是1417 然后我检查字典的长度,大约是11,我不知道数据列表发生了什么,因为所有元素都没有被复制到containsBacon def makeComprehension(data): containsBacon = dict([(

这就是我正在做的:

其中,数据是一个列表列表,其形式为
[[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])
以下是一种方法:

>>> 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]}

与@DevShark answer类似,但具有分解分配:

>>> 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]
条目,如果该条目不存在,则将其设置为空列表。 这个解决方案是@devsharkanswer中的O(n)vs O(n^2)

下面是另一个O(n)版本:

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

如果您想要听写理解,您可以使用
itertools.groupby
作为O(n lgn)解决方案:

>>> 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]}

每个子列表包含3个元素,对吗?那么,您希望哪个元素作为字典键,第一个还是最后一个?您的描述指明了第一个,但您的代码使用了
电影[2]
这是最后一个。哪个是正确的?
containsBacon=dict([(电影[0],电影[1:])
创建
containsBacon
后,是否打算返回它?或者,您是否希望它能够作为一个全球平台提供?如果希望返回,则需要在末尾添加
returncontainsbacon
。如果希望它在全局中可用,则需要将
global containsBacon
添加到函数顶部。否则该函数将不起作用。您可能有重复的键,这会导致列表长度与词典长度之间的差异
>>> 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]}