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ď č. 1Preč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)]