[英]How to create function that accepts lambda expression in python?
如何創建一個接受 lambda 表達式的函數,例如,
# dummy data
data = [{"dim":["abc","sdc"], "mea":[23,23,134]},{"dim":["jgdf","dfc"], "mea":[34,245,2345]}....]
"""
also note that data may be change, [{"x":[{"dim":["abc","sdc"], "mea":[23,23,134]},{"dim":["jgdf","dfc"], "mea":[34,245,2345]}....], "y":.....},...]
but data structure (dictionary) for keys "dim" & "mea" will remain same.
"""
def function(data,key=lambda x: x):
"""
Logic:
sum1 = sum(i["mea"][0] for i in data)
return [[data[i]["dim"],data[i]["mea"][0]] for i in range(len(data)) if data[i]["mea"][0] * len(data) / sum1 > 1]
now i want equivalent lambda function that works for any data
constraint is that structure before "dim" & "mea" will change.
"""
我如何創建這種類型的功能?
任何幫助表示贊賞。
可以將 lambda 視為可調用的任何常規變量:
def function(data, f):
return f(data)
在您的情況下,要創建一個 max 函數:
def max(data, key = lambda x: x):
m = lambda a,b: a if key(a) > key(b) else b
return reduce(m, data)
或更詳細:
def max(data, key = lambda x: x):
max_ = data[0]
for d in data:
if key(d) > key(max_): max_ = d
return max_
如何優化它以避免過於頻繁地調用key
留給讀者作為練習。
更多例子
最大限度:
>>> reduce(lambda a,b: a if a['hi'] > b['hi'] else b, [{"hi":0},{"hi":-1},{"hi":9}])
{'hi': 9}
和:
>>> reduce(lambda a,b: {"hi":a["hi"]+b["hi"]}, [{"hi":1},{"hi":2},{"hi":3}])
{'hi': 6}
更通用:
>>> def generic(data, f, key = lambda x: x, cons = lambda x: x):
... return reduce(lambda a,b: cons(f(key(a),key(b))), data)
...
>>> generic([{"hi":1},{"hi":2},{"hi":3}], lambda a,b: a*b, key = lambda x: x["hi"], cons = lambda x: {"hi":x})
{'hi': 6}
>>> def generic_select(data, f, key = lambda x: x):
... return reduce(lambda a,b: a if f(key(a), key(b)) else b, data)
...
>>> generic_select([{"hi":1,"a":"b"},{"hi":0,"a":"c"}], lambda a,b: True if a < b else False, key = lambda x: x["hi"])
{'a': 'c', 'hi': 0}
這取決於你真正想要做什么。 如果您想要應用 bin op 的縮減,請使用generic
如果想要在 a,b 之間做出決定的縮減,請使用generic_select
。
降低
在沒有導入的情況下,Reduce 在 python3 中不可用,但您可以從 functools 包中導入它。 這是一個非常常見和簡單的模式:
>>> def reduce_(data, f):
... r = data[0]
... for r_ in data[1:]:
... r = f(r, r_)
... return r
...
>>> reduce_([1,2,3], lambda a,b: a+b)
6
>>> reduce_([1,2,3], lambda a,b: a if a > b else b)
3
有時可能需要指定初始值而不是使用data[0]
:
>>> def reduce1(data, init, f):
... r = init
... for r_ in data:
... r = f(r, r_)
... return r
...
>>> reduce1([1,2,3], [], lambda a,b: [b]+a)
[3, 2, 1]
lambda a,b: [b]+a
減少lambda a,b: [b]+a
反轉列表。 reduce
意味着將值列表減少到單個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.