首页 > 解决方案 > 减少字典python上的函数

问题描述

这可能是一个微不足道的问题,但我有一本字典,我想在字典上应用大约 10 个函数来修改它的内容。

我认为这将是一个很好的案例,reduce但我似乎无法让它发挥作用。

这是一个例子

from datetime import datetime
import re
from functools import reduce 


d_ = {
      "dob_partial": "20120314", 
      "service_address_country":"Uni44ed Kind-om"
     }

我想要的结果是:

d_ = {
      "dob_partial": "20120314",
      "dob": datetime.datetime(2012, 3, 14, 0, 0)
      "service_address_country":"Uni44ed Kind-om"
      "service_address_country_clean":"Unied Kindom"
     }

这是可复制的代码:

# pre-processing functions

def clean_address_country_code(d):

    key = 'service_address_country'
    d[key + 'clean'] = re.sub('[^a-zA-Z ]+', '', d[key])

    return d

def add_datestr_to_date(d):

    key = 'dob_partial'
    d['dob'] = datetime.strptime(d.get(key), '%Y%m%d')

    return d

# pipeline function to apply all preprocessing functions

def apply_all_preprocessing(fns, dic):

    reduce(lambda fn, d=dic: fn(dic), fns)

    return dic

fns = [add_datestr_to_date, clean_address_country_code]

apply_all_preprocessing(fns, d_)

仅部分起作用(它仅适用于列表中的第一个函数fns):

>>> print(apply_all_preprocessing(fns, d_))

{'dob_partial': '20120314', 'service_address_country': 'Uni44ed K-?indom', 'dob': datetime.datetime(2012, 3, 14, 0, 0)}

标签: pythondictionaryfunctional-programmingreducefunctools

解决方案


交换 lambda 参数的顺序。应该是lambda value, element: ...。在你的情况下:

def apply_all_preprocessing(fns, dic):
    return reduce(lambda d,f: f(d), fns, dic)

提供初始字典作为reduce().


推荐阅读