优雅的方法从iterable中的每个元素中删除单个键

时间:2017-01-03 18:39:34

标签: python functional-programming

是否可以使用lambdas操作每个字典?

为了澄清,只想从每个元素中删除_id密钥。

Wonder如果没有像(toolz),函数或复制dict对象这样的第三方,有一种优雅的方式来实现这个简单的任务。

我不搜索的可能解决方案。

  1. 传统方式:

    cleansed = {k:v for k,v in data.items() if k not in ['_id'] }
    
  2. 另一种方式:

    def clean(iterable):
        for d in iterable:
            del d['_id']
        return
    
  3. 第三方方式:

  4. Python functional approach: remove key from dict using filter

2 个答案:

答案 0 :(得分:5)

功能编程倾向是不改变原始对象,而是返回数据的新修改副本。主要问题是del是一种陈述,无法在功能上使用。

也许这让你高兴:

[d.pop('_id') for d in my_dicts]

将修改my_dicts中的所有词典,并从中删除'_id'键。结果列表是_id值的列表,但字典在原始my_dicts中进行了编辑。

我根本不建议使用它,因为它不像第二个例子那么容易理解。使用函数式编程来改变持久性数据根本不是优雅的。但如果你需要......

答案 1 :(得分:1)

检查这是否符合您的要求:

# Python 2.x
func = lambda iterable, key="_id": type(iterable)([{k: v for k, v in d.iteritems() if k != key} for d in iterable])

# Python 3.x
func = lambda iterable, key="_id": type(iterable)([{k: v for k, v in d.items() if k != key} for d in iterable])