合并多个列表推导式

3

我有一个字典列表,我想获取列表中两个键的列表。这是我现在的做法:

l_id = [d['id1'] for d in l_data]
l_id.extend([d['id2'] for d in l_data])

有没有一种Pythonic的方法,可以一次完成列表推导并获得相同的结果?(id顺序无关紧要)

请展示给我们列表。 - Malik Brahimi
l_data = [{'id1':1, 'col1':'va1', 'id2':1001}, {'id1':2, 'col1':'va2', 'id2':1002}, ....] 的翻译: - fivelements
4个回答

4

您好

l_id = [d[key] for key in ['id1', 'id2'] for d in l_data]

2
我认为他/她想要它们的顺序相反。 - alexis
也许可以添加 if key in d 来确保不会出现 KeyError。 - Julien Spronck
alexis:我的答案与 OP 的示例一致。如果 OP 表示键是可选的,则我会像 Julien 建议的那样进行修改。 - Alfred Rossi
alexis:哦,我明白了,先全部从id1开始。我已经修改了。 - Alfred Rossi

3

您可以在每次迭代中遍历字典项,并检查键是否为id1id2 ,然后保留值:

[j for d in l_data for i,j in d.items() if i=='id1' or i=='id2']

作为另一种方法,您还可以使用 operator.itemgettermap 函数:
>>> data = [ {'id1':1, 'col1':'va1', 'id2':1001}, {'id1':2, 'col1':'va2', 'id2':1002}]
>>> map(itemgetter('id1','id2'),data)
[(1, 1001), (2, 1002)]

这个代码与原始问题的代码完全不同。 - alexis
@alexis 这只是第二部分使用 itemgetter 的结果,正如我所说的,这是另一种答案! - Mazdak

1
l_id = [d[key] for key in ('id1', 'id2') for d in l_data]

1
如果您想要获取所有id1键的值,然后是所有id2键的值,可以按照以下方式进行操作:
l_id = [ d[k] for k in ["id1", "id2"] for d in l_data if k in d ]

如果您已经知道每个字典都包含您需要的所有ID,那么您可以跳过测试(if k in d)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接