减少字典上的函数 python
reduce functions on a dictionary 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)}
我将简化您的示例以尝试回答我认为您要问的问题。
d_ = {"A": -1, "B": 2}
def f1(n):
return n*2
def f2(n):
return n**2
...
所以我们有一个字典 d_
和一堆我们想要应用到它的值的函数 (fi
);也许所有这些都是按顺序排列的,也许只是其中一些以任何顺序排列。那么,这个怎么样:
def apply_all_preprocessing(fns, dic):
for f in fns:
dic = {k: f(v) for k, v in dic.items()}
return dic
fns = [f1, f2]
res = apply_all_preprocessing(fns, d_)
print(res) # -> {'A': 4, 'B': 16}
# | |= f2(f1(2)) = f2(2 * 2) = 4^2 = 16
# |= f2(f1(-1)) = f2(-1 * 2) = (-2)^2 = 4
你的 lambda 参数的顺序被调换了。应该是lambda value, element: ...
。你的情况:
def apply_all_preprocessing(fns, dic):
return reduce(lambda d,f: f(d), fns, dic)
提供初始字典作为 reduce()
的最后一个参数。
这可能是一个微不足道的问题,但我有一本字典,我想在其中应用大约 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)}
我将简化您的示例以尝试回答我认为您要问的问题。
d_ = {"A": -1, "B": 2}
def f1(n):
return n*2
def f2(n):
return n**2
...
所以我们有一个字典 d_
和一堆我们想要应用到它的值的函数 (fi
);也许所有这些都是按顺序排列的,也许只是其中一些以任何顺序排列。那么,这个怎么样:
def apply_all_preprocessing(fns, dic):
for f in fns:
dic = {k: f(v) for k, v in dic.items()}
return dic
fns = [f1, f2]
res = apply_all_preprocessing(fns, d_)
print(res) # -> {'A': 4, 'B': 16}
# | |= f2(f1(2)) = f2(2 * 2) = 4^2 = 16
# |= f2(f1(-1)) = f2(-1 * 2) = (-2)^2 = 4
你的 lambda 参数的顺序被调换了。应该是lambda value, element: ...
。你的情况:
def apply_all_preprocessing(fns, dic):
return reduce(lambda d,f: f(d), fns, dic)
提供初始字典作为 reduce()
的最后一个参数。