3 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
你應(yīng)該
if det_chem in chem or not_matched.append(det_chem)
但話雖如此,如果您根據(jù)評(píng)論進(jìn)行一些清理,我認(rèn)為有一種更有效的方式來做您想做的事。上面的解釋是append返回None所以整個(gè) if 條件將評(píng)估為False(但該項(xiàng)目仍附加到not_matched列表中)
回復(fù):效率:
res = [{det_chem:chem_db[det_chem]}
for det_chem in detected_chems
if det_chem in chem_db or not_matched.append(det_chem)]
這應(yīng)該會(huì)更快det_chem in chem_db- 字典鍵上的 for 循環(huán)是一個(gè) O(n) 操作,而使用字典正是因?yàn)椴檎沂?O(1) 所以我們使用哈希查找而不是檢索鍵并一一比較它們基于
獎(jiǎng)勵(lì):dict理解(解決問題2)
我不確定為什么要構(gòu)建一鍵字典列表,但可能需要的是字典理解,如下所示:
chem_db = {1: 2, 4: 5}
detected_chems = [1, 3]
not_matched = []
res = {det_chem: chem_db[det_chem] for det_chem in detected_chems if
det_chem in chem_db or not_matched.append(det_chem)}
# output
print(res) # {1: 2}
print(not_matched) # [3]
我無法想到在構(gòu)建not_matched列表的同時(shí)還res使用單個(gè)列表/字典理解進(jìn)行構(gòu)建。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
您的語法錯(cuò)誤來自于理解不接受else子句的事實(shí)。
您最終可以使用... if ... else ...三元運(yùn)算符來確定要放入您的理解結(jié)果的值。如下所示:
not_matched=[]
res = [{chem:chem_db[chem]} if det_chem in chem else not_matched.append(det_chem)
for det_chem in detected_chems
for chem in chem_db.keys()]
但這將是一個(gè)壞主意,因?yàn)槟鷮one在您的resfor each notmatched中。這是因?yàn)?.. if ... else ...運(yùn)算符始終返回一個(gè)值,在您的情況下,該值將是list.append方法的返回值(= None)。然后,您可以過濾res列表以刪除None值,但是......嗯......
更好的解決方案是簡(jiǎn)單地保持您的第一理解并獲得原始chem列表和列表之間的差異res:
not_matched = set(chems).difference(<the already matched chems>)
請(qǐng)注意,我使用了已經(jīng)匹配的 chems占位符而不是真正的代碼塊,因?yàn)槟拇鎯?chǔ)方式res根本不實(shí)用。事實(shí)上,它是一個(gè)單鍵字典列表,這是不合理的。字典的作用是保存由鍵標(biāo)識(shí)的多個(gè)值。
對(duì)此的解決方案是res使用字典理解來制作字典而不是列表:
res = {chem: chem_db[chem]
for det_chem in detected_chems
for chem in chem_db.keys()
if det_chem in chem}
這樣做,已經(jīng)匹配的化學(xué)占位符可以替換為res.values()
另外,即使在很多情況下推導(dǎo)是一個(gè)非??岬墓δ?,它們也不是一個(gè)應(yīng)該在任何地方都使用的神奇功能。嵌套理解真的很難讀,應(yīng)該避免(至少在我看來)。

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
列表理解形式上最多包含 3 個(gè)部分。讓我們?cè)谝粋€(gè)例子中展示它們:
[2 * i for i in range(10) if i % 3 == 0]
第一部分是一個(gè)表達(dá)式——它可能是(或在其中使用)三元運(yùn)算符(
x if y else z
)第二部分是一個(gè)列表(或嵌套
for
循環(huán)中的更多列表),用于從中選擇變量的值。第三部分(可選)是一個(gè)過濾器(用于在第2 部分中進(jìn)行選擇) -這里不允許使用子句!
else
所以如果你想使用else
分支,你必須把它放到第一部分,例如
[2 * i if i < 5 else 3 * i for i in range(10) if i % 3 == 0]
添加回答
舉報(bào)