test_input = {"oneone": 1, "twotwo": 2, "threethree": 3}
def testmethod(no):
print(f"Number {no}")
return True, f"Number {no}"
不使用lambda和map:
d = {}
for k, v in test_input.items():
ret, out = testmethod(v)
if ret:
d[k] = out
我嘗試在下面使用lambdaand進行迭代map:
>>> dict(map(lambda ref: testmethod(ref), list(test_input.values())))
{True: 'Number 3'}
使用map和的預期輸出lambda:
{'oneone': 'Number 1', 'twotwo': 'Number 2', 'threethree': 'Number 3'}
uj5u.com熱心網友回復:
您可以按如下方式重寫回圈:
d = {}
for k, v in test_input.items():
tup = testmethod(v)
if tup[0]:
d[k] = tup[1]
關鍵是打包和解包這兩個回傳值會分散您的注意力,因為它們實際上是一個回傳值。
將此見解與 walrus 運算子結合以合并賦值和條件行:
if (tup := testmethod(v))[0]:
現在你有一些形狀像字典理解的東西:
d = {k: tup[1] for k, v in test_input.items() if (tup := testmethod(v))[0]}
如果您使用的是較舊版本的 python(3.8 之前),或者由于其他原因想要避免使用 walrus,則需要過濾結果。你lambda錯了:lambda ref: testmethod(ref)只是testmethod有額外的步驟。訣竅是在完成映射后拆分流。然后,您可以使用以下內容進行過濾itertools.compress:
from itertools import compress
rets, outs = zip(*map(testmethod, test_input.values()))
d = dict(compress(zip(test_input.keys(), outs), rets))
這是一個相當丑陋且效率低下的兩行代碼。作為單襯,你可以讓它變得更糟。為此,您將rets, outs變成一個串列,將其反轉,然后將其展開為一個 zip 檔案,然后test_input.keys()生成一個生成的迭代器key, value, filter:
d = {k: v for k, v, tf in zip(test_input. keys(), *list(zip(*map(testmethod, test_input.values())))[::-1]) if tf}
uj5u.com熱心網友回復:
IIUC,您想使用 lambda 和 map 將字串添加到 dict 值。你可以做:
out = dict(map(lambda x: (x[0], 'Number' str(x[1])), test_input.items()))
輸出:
{'oneone': 'Number1', 'twotwo': 'Number2', 'threethree': 'Number3'}
現在,如果我們堅持使用testmethod,我們可以稍微調整上面的 lambda 為
out = dict(map(lambda x: (x[0], testmethod(x[1])), test_input.items()))
輸出:
Number 1
Number 2
Number 3
{'oneone': 'Number 1', 'twotwo': 'Number 2', 'threethree': 'Number 3'}
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392957.html
上一篇:創建具有大量鍵值對的字典串列
