/ / Inline spracovanie chýb / výnimiek v pythone - python, zoznam, inline, lambda

Inline chyba / spracovanie výnimiek v python - python, list, inline, lambda

Mám teda 3 zoznamy:

list_1 = ["a","b","c"]
list_2 = ["b","c"]
list_3 = [5,4]

Hľadám generovanie štvrtého zoznamu hodnôtzo zoznamu_2 & list_3, ktoré sa zmapujú do zoznamu_1. list_2 a list_3 sú nezávislé od list_1, ale sú podmnožinami zoznamu_1 a navzájom sa mapujú. t.j. list_2 a list_3 chýba položka „a“ a zodpovedajúce hodnoty.

Chcem spracovať chýbajúce hodnoty a priradiť ichnejaká hodnota, t. j. 0 alebo prázdny reťazec. Chcel by som to urobiť s inline funkciou. zatiaľ som vyskúšal nasledujúce, ale zlyhá. Čo robím zle?

list_4 =[lambda i:list_3[list_2.index(list_1[i])] except "" for i in range(len(list_1))]

Môj konečný výsledok by mal vyzerať takto:

list_4=[0,5,4]

odpovede:

2 pre odpoveď č. 1

Prečo nekontrolujete prítomnosť hodnoty, namiesto spoliehania sa na spracovanie výnimiek?

list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]

2 pre odpoveď č. 2

Efektívnejší spôsob, ako robiť to, čo chcete:

dict_2_to_3 = dict(zip(list_2, list_3))
list_4 = [dict_2_to_3.get(i, 0) for i in list_1]
  • Diktát je omnoho efektívnejší pre vyhľadávanie
  • Na .get() Funkcia umožňuje určiť predvolenú hodnotu, ak sa niečo nenašlo.

2 pre odpoveď č. 3

Môžete ich „inline“ s výnimkou tohto typu: prídu len na vyskúšanie / okrem párov a tie sa nedajú vykonať v lambda.

Pokiaľ nejde o zadanie domácej úlohy alebo puzzle, namiesto toho by som použil slovník:

>>> list_1 = ["a","b","c"]
>>> list_2 = ["b","c"]
>>> list_3 = [5,4]
>>>
>>> mymap = dict(zip(list_2, list_3))
>>> list_4 = [mymap.get(x,0) for x in list_1]
>>> list_4
[0, 5, 4]

Zips kombinuje tieto dva zoznamy do dvojíc:

>>> zip(list_2, list_3)
[("b", 5), ("c", 4)]

Diktát z toho vytvorí slovník (asociatívne pole):

>>> mymap = dict(zip(list_2, list_3))
>>> mymap
{"c": 4, "b": 5}
>>> mymap["c"]
4
>>> mymap["b"]
5

a .get(a,b) metóda v slovníku znamená „vyhľadať kľúč a a vrátiť túto hodnotu, ale ak kľúč nie je nájdený, vráti b.“

>>> mymap.get("c", 0)
4
>>> mymap.get("nope", 0)
0

1 pre odpoveď č. 4

Podľa toho, akú verziu Pythonu používate,list.enumerate () ešte nemusí byť zahrnutý. enumerate by stále existoval ako vstavaný a vrátil by n-tice (index, položka). Čiara, ktorú hľadáte, je:

list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]