Python 在一个列表中为一个dict做一个列表
我需要创建一个列表理解,从列表中的列表中的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
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]