使用Python推导式创建字典列表

10

我有以下字典列表:

    ld=[{'a':10,'b':20},{'p':10,'u':100}]
我希望能写出类似这样的文章:
    [ (k,v) for k,v in [ d.items() for d in ld ] ]

基本上我想遍历列表中的字典,并获取每个字典的键和值,然后进行一些操作。

例如:这样做的一个示例输出将是另一个字典列表,其中某些键已被删除:

        ld=[{'a':10,'b':20},{'p':10,'u':100}]
        new_ld=[{'a':10},{'p':10}]

然而,以上理解是不正确的。任何帮助将不胜感激。


2
预期结果是什么? - thefourtheye
例如:创建另一个字典列表,但不包括某些键。例如:ld=[{'a':10,'b':20},{'p':10,'u':100}],则new_ld=[{'a':10},{'p':10,'u':100}]。 - superMind
为什么你保留一些键而不是其他键? - bozdoz
在"new_ld"中,有些项目被从"ld"中筛选掉了。例如:new_ld=[(k,v) for k,v in [d.items() for d in ld] if k!='b' or k!='u'] - superMind
3个回答

17

正确的列表推导式是 [[(k,v) for k,v in d.items()] for d in ld]

演示:

>>> ld = [{'a': 10, 'b': 20}, {'p': 10, 'u': 100}]
>>> [[(k,v) for k,v in d.items()] for d in ld]
[[('a', 10), ('b', 20)], [('p', 10), ('u', 100)]]
>>> [[(k,v) for k,v in d.items() if k not in ['b','u']] for d in ld]
[[('a', 10)], [('p', 10)]]

3

看起来您想要一个包含键和值配对的元组列表。

为了实现这一点,您可以在列表推导式中使用两个for循环,并使用.items()将键和值输出为元组:

[kv for d in ld for kv in d.items()]

输出:

[('a', 10), ('b', 20), ('p', 10), ('u', 100)]

谢谢你的帮助。但是如果我想这样做,会有问题,因为这个推导式会将所有字典作为一个长输出放置。例如:ld=[{'a':10,'b':20},{'p':10,'u':100}],那么new_ld=[{'a':10},{'p':10,'u':100}],这个推导式就不再起作用了。 - superMind

2
使用itertools.chain.from_iterable来展开序列:
>>> from itertools import chain
>>> ld = [{'a':10,'b':20},{'p':10,'u':100}]
>>> list(chain.from_iterable(d.items() for d in ld))
[('a', 10), ('b', 20), ('p', 10), ('u', 100)]

另一种解决方案是使用双重for推导/生成器,但我发现它们非常难以阅读。

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