第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

帶有 if else 條件的 Python 列表理解

帶有 if else 條件的 Python 列表理解

我有一個(gè)小 (<100) 化學(xué)名稱列表,稱為detected_chems.還有第二個(gè)更大(> 1000)的可迭代;chem_db包含化學(xué)名稱的字典作為鍵,化學(xué)特性字典作為值。像這樣:{'chemicalx':{'property1':'smells','property2':'poisonous'}, 'chemicaly':{'property1':'stinks','property2':'toxic'}}我正在嘗試將所有檢測(cè)到的化學(xué)物質(zhì)與數(shù)據(jù)庫(kù)中的化學(xué)物質(zhì)進(jìn)行匹配并提取它們的屬性。所以我正在制作一個(gè)結(jié)果列表,但是我創(chuàng)建了這個(gè)res,而不是嵌套的帶有條件的循環(huán)。if x inres = [{chem:chem_db[chem]}       for det_chem in detected_chems       for chem in chem_db.keys()       if det_chem in chem]這在一定程度上有效!我(認(rèn)為)在這里做的是創(chuàng)建一個(gè)字典列表,如果發(fā)現(xiàn)檢測(cè)到的化學(xué)物質(zhì),它將具有化學(xué)名稱(鍵)的鍵:值對(duì)和有關(guān)化學(xué)物質(zhì)的信息(作為字典本身,作為值)化學(xué)數(shù)據(jù)庫(kù)(chem_db)中的某處。問題不是所有檢測(cè)到的化學(xué)物質(zhì)都在數(shù)據(jù)庫(kù)中找到。這可能是由于拼寫錯(cuò)誤或名稱變化(例如,它們包括數(shù)字)或類似的原因。所以為了解決這個(gè)問題,我需要確定哪些檢測(cè)到的化學(xué)物質(zhì)不匹配。我認(rèn)為這可能是一個(gè)解決方案:not_matched=[]res = [{chem:chem_db[chem]}       for det_chem in detected_chems       for chem in chem_db.keys()       if det_chem in chem else not_matched.append(det_chem)]由于部分原因,我收到語法錯(cuò)誤else not_matched.append(det_chem)。我有兩個(gè)問題:1)我應(yīng)該把 else 條件放在哪里以避免語法錯(cuò)誤?2)可以在not_matched列表理解中構(gòu)建列表,所以我不會(huì)先創(chuàng)建那個(gè)空列表。res = [{chem:chem_db[chem]}       for det_chem in detected_chems       for chem in chem_db.keys()       if det_chem in chem else print(det_chem)]我想要實(shí)現(xiàn)的是:in: len(detected_chems)out: 20in: len(res)out: 18in: len(not_matched)out: 2in: print(not_matched)out: ['chemical_strange_character$$','chemical___WeirdSPELLING']這將幫助我找到匹配問題。
查看完整描述

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)建。


查看完整回答
反對(duì) 回復(fù) 2022-05-19
?
開心每一天1111

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)該避免(至少在我看來)。


查看完整回答
反對(duì) 回復(fù) 2022-05-19
?
湖上湖

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]
  1. 第一部分是一個(gè)表達(dá)式——它可能是(或在其中使用)三元運(yùn)算符x if y else z)

  2. 第二部分是一個(gè)列表或嵌套for循環(huán)中的更多列表),用于從中選擇變量的值。

  3. 第三部分(可選)是一個(gè)過濾器(用于在2 部分中進(jìn)行選擇) -這里不允許使用子句!else

所以如果你想使用else分支,你必須把它放到第一部分,例如

[2 * i  if i < 5  else 3 * i           for i in range(10)          if i % 3 == 0]


查看完整回答
反對(duì) 回復(fù) 2022-05-19
  • 3 回答
  • 0 關(guān)注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)