Да бисте генерисали нову листу у Питхон-у издвајањем или брисањем само оних елемената постојеће листе (низа) који задовољавају одређене услове, или вршењем замене или конверзије, користите разумевања листе.
Овде је објашњено следеће, заједно са примером кода.
- Основни облик нотације за разумевање листе
- Примените процес на све елементе листе
- Издвојите и избришите елементе са листе који испуњавају критеријуме
- Замените или конвертујте елементе који задовољавају услове листе
Погледајте следећи чланак за конкретне примере листа стрингова.
Такође је могуће насумично издвојити елементе који не испуњавају критеријуме.
Имајте на уму да листе могу да чувају различите типове података и да се стриктно разликују од низова. Ако желите да рукујете низовима у процесима који захтевају величину меморије и меморијске адресе или нумеричку обраду великих података, користите низ (стандардна библиотека) или НумПи.
Следећа листа је пример
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Основни облик нотације за разумевање листе
Када генеришете нову листу из листе, разумевање листе је једноставније за писање него за петље.
[expression for any variable name in iterable object 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]
Ако је „ако условни израз“ постављен на „ако није условни израз“, он постаје негација и само елементи који не задовољавају услов (елементи за које је условни израз нетачан) могу бити изабрани и издвојени. Другим речима, генерише се нова листа из које се уклањају елементи који задовољавају услов.
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]
Наравно, исти резултат се добија навођењем еквивалентног условног израза без употребе нот.
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]
Замените или конвертујте елементе који задовољавају услове листе
У горњем примеру екстракције елемената, елементи који нису задовољили услове су уклоњени.
Ако желите да извршите замене, конверзије итд. само на елементима који задовољавају услове, примените тернарни оператор на део израза нотације за разумевање листе.
У Питхон-у, тернарни оператор се може написати на следећи начин
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]
Ако је било које име променљиве написано као што јесте за тачне или нетачне вредности, вредност оригиналног елемента се користи онаква каква јесте. Ако је израз написан, примењује се обрада тог израза.
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]