Järjendi genereerimise lühiesitus (List comprehension)

Järjendi genereerimise lühiesitus ehk list comprehension on alternatiivne viis järjendi loomiseks.

Tavapäraselt toimub järjendi loomine ja andmete täitmine eraldi sammudena: kõigepealt luuakse tühi järjend ja seejärel näiteks for-tsükliga lisatakse sinna elemendid.

List comprehension'i puhul täidetakse järjendit selle loomise ajal. Järjendi loomise lauses on võimalik kasutada for-tsükleid ja if-tingimusi.

Üldine kuju järjendi loomiseks lühiesitusega on järgmine:

new_list = [expression for item in iterable]

expression on avaldis, mis arvutatakse iga elemendi kohta iterable andmehulgast (näiteks järjend või ennik).

Näiteks loome uue listi, kus algse listi elementidele on liidetud juurde 1:

numbers = [1, 5, 6, 7]
numbers_increased = [nr + 1 for nr in numbers]
# [2, 6, 7, 8]

Sama kood klassikalise tsükliga:

numbers = [1, 5, 6, 7]
numbers_increased = []
for nr in numbers:
   numbers_increased.append(nr + 1)

Lisaks on võimalik kasutada tingimuslauset elementide filtreerimiseks. Näiteks suurendame elemente 1 võrra, kui algne element on paarisarv:

numbers = [1, 2, 5, 6, 7]
numbers_increased = [nr + 1 for nr in numbers if nr % 2 == 0]
# [3, 7]

Sama kood klassikalise tsükliga:

numbers = [1, 2, 5, 6, 7]
numbers_increased = []
for nr in numbers:
   if nr % 2 == 0:
      numbers_increased.append(nr + 1)

Kuigi peaaegu kõike, mida saab teha for-tsükliga saab teha list comprehension'iga ja vastupidi, siis on loetavuse huvides mõistlik lühigenereerimist kasutada vaid lihtsamate järjendite loomisel. Tavaliselt kasutatakse seda järjendist elementide filtreerimise ja lihtsama muutmise korral.

Näited

Üldised kujud:

[el for el in elements]
# you can add if statement in front of an el to transform it accordingly >
[el if el < 0 else el.changed() for el in elements]
# you can filter the array >
[el for el in elements if el == "condition"]

Siin erinevad näited list-comprehension'iga:

#1) double every element
numbers = [1, 2, 3, 4]
result = [i + i for i in numbers]
print(result)
# [2, 4, 6, 8]

# ----------------------------------
# 2) find vowels from list

letters = ['a', 'e', 'i', 'o', 'u']
sequence = ['g', 'e', 'e', 'j', 'k', 's', 'p', 'r']
filtered = [el for el in sequence if el in letters]
print(filtered)
# ["e", "e"]

Veel näiteid:

# 1) If statement in list comprehension, filtering >
number_list = [x for x in range(20) if x % 2 == 0]
print(number_list)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# ----------------------------------
# 2) Nested if statements in list comprehension >
num_list = [y for y in range(100) if y % 2 == 0 if y % 5 == 0]
print(num_list)
# [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

# ----------------------------------
# 3) Inline if statement on the element to transform it >
obj = ["Even" if i % 2 == 0 else "Odd" for i in range(10)]
print(obj)
# ['Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']

# ----------------------------------
# 4) Nested list comprehension
matrix = [[1, 2], [3,4], [5,6], [7,8]]
transpose = [[row[i] for row in matrix] for i in range(2)]
print (transpose)
# [[1, 3, 5, 7], [2, 4, 6, 8]]

# ----------------------------------
# 5) Use another method in list comprehension
def square(n):
 return n ** 2
squared_list = [square(i) for i in range(5)]
print (squared_list)
# [0, 1, 4, 9, 16]

Lisalugemist