/ / Inline błąd / obsługa wyjątków w Pythonie - python, lista, inline, lambda

Obsługa błędów / wyjątków w pythonie - python, lista, inline, lambda

Więc mam 3 listy w następujący sposób:

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

Szukam wygenerować czwartą listę wartościz listy_2 i listy_3, która mapuje na listę_1. lista_2 i lista_3 są niezależne od listy_1, ale są podzbiorami listy_1 i mapują się wzajemnie. tj. lista_2 i lista_3 nie zawierają pozycji „a” i odpowiadających im wartości.

Chcę poradzić sobie z brakującymi wartościami i przypisaćniektóre wartości, np. 0 lub pusty ciąg. Chciałbym to zrobić za pomocą funkcji inline. jak dotąd próbowałem, ale to się nie udaje. Co ja robię źle?

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

Mój końcowy wynik powinien wyglądać następująco:

list_4=[0,5,4]

Odpowiedzi:

2 dla odpowiedzi № 1

Dlaczego nie sprawdzasz obecności wartości, zamiast polegać na obsłudze wyjątków?

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

2 dla odpowiedzi nr 2

Bardziej wydajny sposób robienia tego, co chcesz:

dict_2_to_3 = dict(zip(list_2, list_3))
list_4 = [dict_2_to_3.get(i, 0) for i in list_1]
  • Dykta jest znacznie bardziej wydajna w przypadku wyszukiwania
  • The .get() funkcja pozwala określić domyślną wartość, jeśli coś nie jest znalezione.

2 dla odpowiedzi nr 3

Możesz „t inline” z wyjątkiem „s takich jak te; przychodzą tylko w parach try / except, a tych nie można zrobić w lambdzie.

Jeśli nie jest to zadanie domowe lub łamigłówka, użyłbym słownika:

>>> 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]

Zip łączy dwie listy w pary:

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

Dykta sprawia, że ​​słownik (tablica asocjacyjna) wychodzi z tego:

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

i .get(a,b) metoda w słowniku oznacza „wyszukaj klucz a i zwróć tę wartość, ale jeśli nie znaleziono klucza, zwróć b.”

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

1 dla odpowiedzi nr 4

W zależności od używanej wersji Pythonalist.enumerate () może jeszcze nie zostać uwzględniony. enumerate nadal będzie istniał jako wbudowany i zwróci krotki (index, item). Więc linia, której szukasz, to:

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