Egy új lista létrehozásához Pythonban egy meglévő lista (tömb) csak azon elemeinek kivonásával vagy törlésével, amelyek megfelelnek bizonyos feltételeknek, vagy cserék vagy átalakítások elvégzésével, használjuk a listafelfogásokat.
A következőket itt magyarázzuk el, mintakóddal együtt.
- A lista megértésének alapformája
- Alkalmazza a folyamatot a lista összes elemére
- A kritériumoknak megfelelő elemek kivonása és törlése a listából
- A lista feltételeinek megfelelő elemek cseréje vagy átalakítása.
A karakterláncok listáira vonatkozó konkrét példákat lásd a következő cikkben.
Lehetőség van olyan elemek véletlenszerű kivonására is, amelyek nem felelnek meg a kritériumoknak.
Vegye figyelembe, hogy a listák különböző típusú adatokat tárolhatnak, és szigorúan különböznek a tömböktől. Ha olyan folyamatokban szeretnénk tömböket kezelni, amelyek memóriaméretet és memóriacímeket vagy nagyméretű adatok numerikus feldolgozását igénylik, használjuk a array (standard könyvtár) vagy a NumPy programot.
A következő lista egy példa
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
A lista megértésének alapformája
Amikor egy listából új listát generálunk, a listakövetelmények egyszerűbben írhatók, mint a for ciklusok.
[expression for any variable name in iterable object if conditional expression]
A kifejezés egy olyan elemre vonatkozik, amely kielégíti egy iterálható objektum (például egy lista vagy egy tuple) feltételes kifejezését, és egy új lista elemévé válik. A “ha feltételes kifejezés” elhagyható, ebben az esetben a kifejezés minden elemre vonatkozik.
További részletekért lásd a következő cikket, beleértve a beágyazott listák megértésének jelölését.
Alkalmazza a folyamatot a lista összes elemére
Ha például egy lista összes elemére szeretne valamilyen feldolgozást alkalmazni, írja le a kívánt feldolgozást a fenti listamegértési kifejezésben.
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']
Ez használható a számok és a karakterláncok listái közötti konvertálásra.
A kritériumoknak megfelelő elemek kivonása és törlése a listából
Ha az elemet csak feltételes kifejezéssel kell kiválasztani, akkor azt nem dolgozza fel egy kifejezés, így az a következő formát veszi fel
[variable name for variable name in original list if conditional expression]
Egy új lista generálódik, amelyből csak a feltételnek megfelelő elemek (olyan elemek, amelyekre a feltételes kifejezés igaz) kerülnek kivonásra.
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]
Ha a “ha feltételes kifejezés” értéke “ha nem feltételes kifejezés”, akkor a feltétel negációvá válik, és csak azok az elemek választhatók ki és vonhatók ki, amelyek nem felelnek meg a feltételnek (olyan elemek, amelyek esetében a feltételes kifejezés hamis). Más szóval, egy új lista jön létre, amelyből a feltételnek megfelelő elemek eltávolításra kerülnek.
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]
Természetesen ugyanezt az eredményt kapjuk az egyenértékű feltételes kifejezés megadásával a not használata nélkül is.
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]
A feltételes kifejezés része több feltétel is lehet. Negatív nemek is használhatók.
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]
A lista feltételeinek megfelelő elemek cseréje vagy átalakítása.
A fenti elemkivonási példában a feltételeknek nem megfelelő elemeket eltávolítottuk.
Ha csak a feltételeknek megfelelő elemeken szeretnénk helyettesítést, átalakítást stb. végrehajtani, akkor a listamegértési jelölés kifejezésrészére alkalmazzuk a terner operátort.
Pythonban a terner operátor a következőképpen írható le
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
Ez egy kicsit bonyolult, de a listamegértési jelölés és a terner operátorok kombinációja a következő.
[True Value if Conditional Expression else False Value for any variable name in original list]
A zárójelbe zárt rész a terner operátor (a zárójelek nem szükségesek a tényleges kódban).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Ha bármely változó neve igaz vagy hamis értékek esetén úgy van írva, ahogy van, akkor az eredeti elem értéke úgy van használva, ahogy van. Ha egy kifejezés van leírva, akkor a kifejezés feldolgozása kerül alkalmazásra.
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]