Aby wygenerować nową listę w Pythonie przez wyodrębnienie lub usunięcie tylko tych elementów istniejącej listy (tablicy), które spełniają określone warunki, lub przez wykonanie zamiany lub konwersji, należy użyć list comprehensions.
Objaśniono tu następujące zagadnienia wraz z przykładowym kodem.
- Podstawowa forma notacji rozumienia listy
- Zastosuj tę procedurę do wszystkich elementów listy
- Wyodrębnij i usuń z listy elementy, które spełniają kryteria
- Zastąp lub zamień elementy, które spełniają warunki listy
Przykłady list ciągów znaków można znaleźć w poniższym artykule.
- RELATED:Wyodrębnianie i zastępowanie elementów spełniających warunki listy (tablicy) łańcuchów w Pythonie
Możliwe jest także losowe wyodrębnianie elementów, które nie spełniają kryteriów.
Należy pamiętać, że listy mogą przechowywać różne typy danych i różnią się ściśle od tablic. Jeśli chcesz obsługiwać tablice w procesach, które wymagają wielkości pamięci i adresów pamięci lub numerycznego przetwarzania dużych danych, użyj tablicy (biblioteka standardowa) lub NumPy.
Poniższa lista jest przykładowa
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Podstawowa forma notacji rozumienia listy
W przypadku generowania nowej listy na podstawie listy, kompetycje list są prostsze do napisania niż pętle for.
[expression for any variable name in iterable object if conditional expression]
Wyrażenie jest stosowane do elementu, który spełnia wyrażenie warunkowe obiektu iterowalnego (takiego jak lista lub tuple) i staje się elementem nowej listy. Wyrażenie „jeżeli wyrażenie warunkowe” można pominąć – wówczas wyrażenie jest stosowane do wszystkich elementów.
Więcej szczegółów, w tym notacja rozumienia listy zagnieżdżonej, można znaleźć w poniższym artykule.
Zastosuj tę procedurę do wszystkich elementów listy
Na przykład, jeśli chcesz zastosować pewne przetwarzanie do wszystkich elementów listy, opisz żądane przetwarzanie w powyższym wyrażeniu list comprehension.
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
Można tego użyć do konwersji między listami liczb i łańcuchów.
Wyodrębnij i usuń z listy elementy, które spełniają kryteria
Jeśli element ma być wybrany tylko przez wyrażenie warunkowe, nie jest on przetwarzany przez wyrażenie, więc przyjmuje następującą postać
[variable name for variable name in original list if conditional expression]
Generowana jest nowa lista, z której wyodrębniane są tylko te elementy, które spełniają warunek (elementy, dla których wyrażenie warunkowe jest prawdziwe).
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
Jeśli „jeśli wyrażenie warunkowe” zostanie ustawione na „jeśli nie wyrażenie warunkowe”, staje się ono negacją i tylko elementy, które nie spełniają warunku (elementy, dla których wyrażenie warunkowe jest fałszywe), mogą zostać wybrane i wyodrębnione. Innymi słowy, tworzona jest nowa lista, z której usuwane są elementy spełniające warunek.
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Oczywiście taki sam rezultat można uzyskać, podając równoważne wyrażenie warunkowe bez użycia not.
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Część wyrażenia warunkowego może zawierać wiele warunków. Można również używać ujemnych not.
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
Zastąp lub zamień elementy, które spełniają warunki listy
W powyższym przykładzie ekstrakcji elementów usunięto elementy, które nie spełniały warunków.
Jeśli chcesz wykonywać podstawienia, konwersje itp. tylko na elementach, które spełniają warunki, zastosuj operator trójskładnikowy do części wyrażeniowej notacji listowej.
W języku Python operator trójskładnikowy można zapisać w następujący sposób
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
Jest to nieco skomplikowane, ale kombinacja notacji rozumienia listy i operatorów trójskładnikowych jest następująca.
[True Value if Conditional Expression else False Value for any variable name in original list]
Część zamknięta w nawiasach to operator trójskładnikowy (nawiasy nie są konieczne w kodzie).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Jeśli nazwa zmiennej zostanie zapisana w postaci wartości true lub false, zostanie użyta wartość oryginalnego elementu. Jeśli zostanie napisane wyrażenie, zostanie zastosowane przetwarzanie tego wyrażenia.
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]