python - 减少字典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)}
解决方案
交换 lambda 参数的顺序。应该是lambda value, element: ...
。在你的情况下:
def apply_all_preprocessing(fns, dic):
return reduce(lambda d,f: f(d), fns, dic)
提供初始字典作为reduce()
.
推荐阅读
- javascript - 由于 MIME 类型 ("text/css") 不匹配 (X-Content-Type-Options: nosniff),来自 "/Styles/Common/bootstrap.min.css" 的资源被阻止
- google-apps-script - DriveApp.getFileById(fileId) - 错误:找不到具有给定 ID 的项目
- azure - 当逻辑应用程序中的“获取实体”没有结果时如何防止下一步
- sql - 查询总和值相等的顶行和其他行
- r - 在另一个 Data Frame 中查找具有部分匹配的行,然后将其输出写入原始 DF
- django - 使用 postgresql 的 django 中非主字段的默认整数值
- firebase - 网络用户的firebase动态链接
- java - 在一个 Spring Boot 应用程序中使用多个不同的 kafka 服务器的方法是什么?
- python-3.x - 如何让我的进度条在 Flask stream_with_context 中更新
- c++ - 在 C++ 中使用分隔符获取输入