Извличане, заместване и трансформиране на определени елементи от списъци (масиви) в Python

Бизнес

За генериране на нов списък в Python чрез извличане или изтриване само на онези елементи от съществуващ списък (масив), които отговарят на определени условия, или чрез извършване на замени или преобразувания, използвайте разбиране на списъци.

Тук е обяснено следното, както и примерен код.

  • Основна форма на запис за разбиране на списък
  • Прилагане на процеса към всички елементи на списъка
  • Извличане и изтриване на елементи от списъка, които отговарят на критериите
  • Замяна или преобразуване на елементи, които отговарят на условията на списъка

Вижте следната статия за конкретни примери за списъци от низове.

Възможно е и произволно избиране на елементи, които не отговарят на критериите.

Обърнете внимание, че списъците могат да съхраняват различни типове данни и са строго различни от масивите. Ако искате да работите с масиви в процеси, които изискват размер на паметта и адреси в паметта или числена обработка на големи данни, използвайте array (стандартна библиотека) или NumPy.

Следният списък е пример

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Основна форма на запис за разбиране на списък

Когато се генерира нов списък от списък, разбирането на списъци е по-просто за писане от циклите for.

[expression for any variable name in iterable object if conditional expression]

Изразът се прилага към елемент, който отговаря на условния израз на итерабилен обект (например списък или кортеж) и се превръща в елемент на нов списък. Изразът „if conditional expression“ може да бъде пропуснат, като в този случай изразът се прилага към всички елементи.

Вижте следната статия за повече подробности, включително обозначението за разбиране на вложен списък.

Прилагане на процеса към всички елементи на списъка

Например, ако искате да приложите някаква обработка към всички елементи на списък, опишете желаната обработка в израза за разбиране на списък по-горе.

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

Това може да се използва за преобразуване между списъци от числа и списъци от низове.

Извличане и изтриване на елементи от списъка, които отговарят на критериите

Ако елементът трябва да бъде избран само с условен израз, той не се обработва с израз, така че приема следната форма

[variable name for variable name in original list if conditional expression]

Генерира се нов списък, от който се извличат само елементите, които отговарят на условието (елементите, за които условният израз е верен).

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]

Ако „if conditional expression“ се зададе на „if not conditional expression“, той се превръща в отрицание и могат да бъдат избрани и извлечени само елементи, които не отговарят на условието (елементи, за които условният израз е false). С други думи, генерира се нов списък, от който се изваждат елементите, които удовлетворяват условието.

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]

Разбира се, същият резултат се получава и при задаване на еквивалентен условен израз, без да се използва 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]

Частта с условния израз може да съдържа няколко условия. Могат да се използват и отрицателни ноти.

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]

Замяна или преобразуване на елементи, които отговарят на условията на списъка

В примера за извличане на елементи по-горе елементите, които не отговарят на условията, бяха премахнати.

Ако искате да извършвате замествания, преобразувания и т.н. само върху елементи, които отговарят на условията, приложете тройния оператор към изразната част на записа за разбиране на списък.

На езика Python тернарният оператор може да се запише по следния начин

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

Това е малко по-сложно, но комбинацията от запис за разбиране на списък и тройни оператори е следната.

[True Value if Conditional Expression else False Value for any variable name in original list]

Частта, затворена в скоби, е тройният оператор (скобите не са необходими в действителния код).

[(True Value if Conditional Expression else False Value) for any variable name in original list]

Ако някое име на променлива е записано като true или false, стойността на оригиналния елемент се използва като такава. Ако е записан израз, се прилага обработката на този израз.

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]
Copied title and URL