Python 在一个列表中为一个dict做一个列表

Python 在一个列表中为一个dict做一个列表,python,list,dictionary,list-comprehension,Python,List,Dictionary,List Comprehension,我需要创建一个列表理解,从列表中的列表中的dict中提取值,到目前为止,我的尝试都失败了。该对象如下所示: MyList=[[{'animal':'A','color':'blue'},{'animal':'B','color':'red'}],[{'animal':'C','color':'blue'},{'animal':'D','color':'Y'}]] 我想提取dict/list/list中每个元素的值,以便得到两个新列表: Animals=[[A,B],[C,D]] Colors

我需要创建一个列表理解,从列表中的列表中的dict中提取值,到目前为止,我的尝试都失败了。该对象如下所示:

MyList=[[{'animal':'A','color':'blue'},{'animal':'B','color':'red'}],[{'animal':'C','color':'blue'},{'animal':'D','color':'Y'}]] 
我想提取dict/list/list中每个元素的值,以便得到两个新列表:

Animals=[[A,B],[C,D]]
Colors=[[blue,red],[blue,Y]]
有什么建议吗?不一定需要使用列表理解;到目前为止,这只是我的出发点。谢谢

Animals = [[d['animal'] for d in sub] for sub in MyList]
Colors = [[d['color'] for d in sub] for sub in MyList]
给出了期望的结果:

[['A', 'B'], ['C', 'D']]
[['blue', 'red'], ['blue', 'Y']]  # No second 'red'.

我在这里所做的是获取每个子列表,然后是每个字典,然后访问正确的键。

在一个作业中(通过一个列表理解,并借助
map
zip
):

如果您对元组没有意见,那么可以避免对map=>list的两个调用

编辑

让我们通过分解嵌套理解来了解一些细节。 我们还假设
MyList
m
元素,总共有
n
对象(字典)

这将遍历子列表中的每个字典。对于每一个元素,我们创建一对,第一个元素中包含其
color
属性,第二个元素中包含其
animal
属性:

(d['color'], d['animal'])
到目前为止,这将需要与
O(n)
成比例的时间-例如
n
元素将被处理

print [[(d['color'], d['animal']) for d in sub] for sub in MyList]
现在,对于原始列表的每个
m
子列表,我们有一个需要解压的夫妇列表,即将其转换为两个单亲列表。在Python中,解压是使用
zip
函数执行的,方法是将可变数量的元组作为参数传递(第一个元组的算术性决定了它输出的元组数量)。例如,通过3对,我们得到两个列表,每个列表包含3个元素

>>> zip((1,2), (3,4), (5,6))  #Prints [(1, 3, 5), (2, 4, 6)]
为了将这一点应用到我们的案例中,我们需要将耦合数组作为可变数量的参数传递给
zip
:这是使用splat操作符完成的,即

此操作需要遍历每个子列表一次,然后依次遍历我们在上一步中创建的每一对。因此,总运行时间为
O(n+n+m)
=
O(n)
,大约为
2*n+2*m
操作

到目前为止,我们有
m
子列表,每个子列表包含两个元组(第一个元组将收集子列表的所有颜色,第二个元组将收集所有动物的颜色)。为了获得两个分别包含
m
元组的列表,我们再次应用解压

zip(*[zip(*[(d['color'], d['animal']) for d in sub]) for sub in MyList]
这将需要额外的
m
步骤-因此运行时间将保持
O(n)
,大约
2*n+4*m
操作

为了简单起见,在本分析中,我们省略了将元组映射到列表的过程——如果您同意使用元组,那么这很好

然而,元组是不可变的,因此情况可能并非如此。
如果需要列表列表,则需要对每个元组应用
list
函数:每个
m
子列表一次(总共
2*n
元素),以及两个一级列表中的每个一次,即动物和颜色(每个都有
m
元素)。假设
列表
所需的时间与其应用的序列长度成比例,则此额外步骤需要
2*n+2*m
操作,这仍然是
O(n)

它最后如何显示
[蓝色,红色]
?谢谢!很好用!用MyList=[{'animal':'A','color':'blue'},{'animal':'B','color':'red'},{'animal':'E','color':'g'}],{'animal':'C','color':'blue'},{'animal':'D','color':'Y'},{'animal':'H','color':'black'}]试试看,{/code。另外,遍历列表两次,一次提取动物,一次提取颜色,可能会更快,尤其是当您被迫使用map将元组转换为列表时。然而,这看起来是一个很好的机会来练习压缩、解压和列表理解
>>> zip((1,2), (3,4), (5,6))  #Prints [(1, 3, 5), (2, 4, 6)]
[zip(*[(d['color'], d['animal']) for d in sub]) for sub in MyList]
zip(*[zip(*[(d['color'], d['animal']) for d in sub]) for sub in MyList]