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 № 1Dlaczego 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)]