簡體   English   中英

如何在python中創建接受lambda表達式的函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM