Wyodrębnianie, zastępowanie i przekształcanie określonych elementów list (tablic) w języku Python

Biznes

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.

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]