Nggunakake notasi pangerten dhaptar Python

Bisnis

Ing Python, gampang nggunakake notasi pangerten dhaptar nalika nggawe dhaptar anyar.(List comprehensions)

Ing artikel iki, kita bakal ngrembug babagan ing ngisor iki

  • Jinis dhasar notasi pangerten dhaptar
  • Dhaptar notasi pangerten kanthi percabangan kondisional dening if
  • Kombinasi karo operator ternary (yen kaya pangolahan liyane)
  • zip(),enumerate()Kombinasi karo iki
  • notasi daftar nested

Sabanjure, kita bakal nerangake set notasi pangerten dhaptar kanthi kode sampel.

  • nyetel notasi inklusi(Set comprehensions)
  • notasi inklusi kamus(Dict comprehensions)
  • jinis generator(Generator expressions)

Jinis dhasar notasi pangerten dhaptar

Notasi pangerten dhaptar ditulis kaya ing ngisor iki.

[Expression for Any Variable Name in Iterable Object]

Butuh saben unsur obyek sing bisa diulang kayata dhaptar, tuple, utawa kisaran kanthi jeneng variabel sewenang-wenang lan ngevaluasi kanthi ekspresi. Dhaptar anyar kanthi asil evaluasi minangka unsur bali.

Conto diwenehi bebarengan karo padha kanggo statement.

squares = [i**2 for i in range(5)]
print(squares)
# [0, 1, 4, 9, 16]
squares = []
for i in range(5):
    squares.append(i**2)

print(squares)
# [0, 1, 4, 9, 16]

Proses padha bisa rampung karo map (), nanging dhaftar pangerten notasi disenengi kanggo gamblang lan gamblang.

Dhaptar notasi pangerten kanthi percabangan kondisional dening if

Cabang kondisional karo yen uga bisa. Tulisen yen ing postfix kaya ing ngisor iki.

[Expression for Any Variable Name in Iterable Object if Conditional Expression]

Mung unsur obyek iterable sing ekspresi kondisional bener dievaluasi dening ekspresi kasebut, lan dhaptar anyar sing unsur minangka asil bakal bali.

Sampeyan bisa nggunakake jeneng variabel ing ekspresi kondisional.

Conto diwenehi bebarengan karo padha kanggo statement.

odds = [i for i in range(10) if i % 2 == 1]
print(odds)
# [1, 3, 5, 7, 9]
odds = []
for i in range(10):
    if i % 2 == 1:
        odds.append(i)

print(odds)
# [1, 3, 5, 7, 9]

Proses padha bisa rampung karo Filter (), nanging dhaftar pangerten notasi disenengi kanggo gamblang lan gamblang.

Kombinasi karo operator ternary (yen kaya pangolahan liyane)

Ing conto ing ndhuwur, mung unsur sing cocog karo kritéria sing diproses, lan sing ora cocog karo kritéria kasebut ora kalebu saka dhaptar anyar.

Yen sampeyan pengin ngalih proses gumantung ing kondisi, utawa yen sampeyan pengin ngolah unsur sing ora gawe marem kondisi beda, kaya yen liyane, nggunakake operator ternary.

Ing Python, operator ternary bisa ditulis kaya ing ngisor iki

Value When True if Conditional Expression else Value When False

Iki digunakake ing bagean ekspresi saka notasi pangerten dhaptar kaya ing ngisor iki.

[Value When True if Conditional Expression else Value When False for Any Variable Name in Iterable Object]

Conto diwenehi bebarengan karo padha kanggo statement.

odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
odd_even = []
for i in range(10):
    if i % 2 == 1:
        odd_even.append('odd')
    else:
        odd_even.append('even')

print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']

Sampeyan uga bisa nulis ekspresi nggunakake jeneng variabel arbitrer kanggo nilai sing bener lan salah.

Yen kondisi wis wareg, sawetara Processing wis rampung, digunakake Nilai saka obyek iterable asli kiwa panggah.

odd10 = [i * 10 if i % 2 == 1 else i for i in range(10)]
print(odd10)
# [0, 10, 2, 30, 4, 50, 6, 70, 8, 90]

Kombinasi karo zip() lan enumerate()

Fungsi migunani sing asring digunakake ing statement for kalebu zip (), kang nggabungke sawetara iterables, lan enumerate (), kang ngasilake nilai bebarengan karo indeks.

Mesthi, iku bisa nggunakake zip () lan enumerate () karo dhaftar pangerten notasi. Iku ora sintaks khusus, lan iku ora angel yen sampeyan nimbang Correspondence karo kanggo statement.

Tuladha zip().

l_str1 = ['a', 'b', 'c']
l_str2 = ['x', 'y', 'z']

l_zip = [(s1, s2) for s1, s2 in zip(l_str1, l_str2)]
print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]
l_zip = []
for s1, s2 in zip(l_str1, l_str2):
    l_zip.append((s1, s2))

print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]

Tuladha enumerate().

l_enu = [(i, s) for i, s in enumerate(l_str1)]
print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]
l_enu = []
for i, s in enumerate(l_str1):
    l_enu.append((i, s))

print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]

Ide kasebut padha karo sadurunge nalika nggunakake yen.

l_zip_if = [(s1, s2) for s1, s2 in zip(l_str1, l_str2) if s1 != 'b']
print(l_zip_if)
# [('a', 'x'), ('c', 'z')]

Saben unsur uga bisa digunakake kanggo ngetung unsur anyar.

l_int1 = [1, 2, 3]
l_int2 = [10, 20, 30]

l_sub = [i2 - i1 for i1, i2 in zip(l_int1, l_int2)]
print(l_sub)
# [9, 18, 27]

notasi daftar nested

Kaya nesting for loops, notasi pangerten dhaptar uga bisa disarang.

[Expression for Variable Name 1 in Iterable Object 1
    for Variable Name 2 in Iterable Object 2
        for Variable Name 3 in Iterable Object 3 ... ]

Kanggo penak, baris break lan indentations wis ditambahake, nanging ora dibutuhake kanggo grammar; padha bisa terus ing baris siji.

Conto diwenehi bebarengan karo padha kanggo statement.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

flat = [x for row in matrix for x in row]
print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
flat = []
for row in matrix:
    for x in row:
        flat.append(x)

print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

Sampeyan uga bisa nggunakake macem-macem variabel.

cells = [(row, col) for row in range(3) for col in range(2)]
print(cells)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

Sampeyan uga bisa nindakake percabangan kondisional.

cells = [(row, col) for row in range(3)
         for col in range(2) if col == row]
print(cells)
# [(0, 0), (1, 1)]

Sampeyan uga bisa kanggo conditionally cabang kanggo saben obyek iterable.

cells = [(row, col) for row in range(3) if row % 2 == 0
         for col in range(2) if col % 2 == 0]
print(cells)
# [(0, 0), (2, 0)]

nyetel notasi inklusi(Set comprehensions)

Ngganti tanda kurung kotak [] ing notasi pangerten dhaptar dadi kurung kriting {} nggawe set (objek jinis set).

{Expression for Any Variable Name in Iterable Object}
s = {i**2 for i in range(5)}

print(s)
# {0, 1, 4, 9, 16}

notasi inklusi kamus(Dict comprehensions)

Kamus (obyek jinis dict) uga bisa digawe kanthi notasi pemahaman.

{}, lan nemtokake kunci lan nilai ing bagean ekspresi minangka kunci: nilai.

{Key: Value for Any Variable Name in Iterable Object}

Sembarang ekspresi bisa ditemtokake kanggo kunci lan nilai.

l = ['Alice', 'Bob', 'Charlie']

d = {s: len(s) for s in l}
print(d)
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}

Kanggo nggawe kamus anyar saka dhaptar tombol lan nilai, gunakake fungsi zip ().

keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]

d = {k: v for k, v in zip(keys, values)}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

jinis generator(Generator expressions)

Yen kurung kothak [] ing notasi pangerten dhaftar digunakake minangka kurung babak (), generator bali tinimbang tuple. Iki diarani ekspresi generator.

Tuladha notasi pangerten dhaptar.

l = [i**2 for i in range(5)]

print(l)
# [0, 1, 4, 9, 16]

print(type(l))
# <class 'list'>

Tuladha ekspresi generator. Yen sampeyan print () generator minangka, iku ora print metu isine, nanging yen sampeyan mbukak karo kanggo statement, sampeyan bisa njaluk isi.

g = (i**2 for i in range(5))

print(g)
# <generator object <genexpr> at 0x10af944f8>

print(type(g))
# <class 'generator'>

for i in g:
    print(i)
# 0
# 1
# 4
# 9
# 16

Ekspresi generator uga ngidini percabangan kondisional lan nesting nggunakake yen uga notasi pangerten dhaptar.

g_cells = ((row, col) for row in range(0, 3)
           for col in range(0, 2) if col == row)

print(type(g_cells))
# <class 'generator'>

for i in g_cells:
    print(i)
# (0, 0)
# (1, 1)

Contone, yen dhaptar kanthi akeh unsur digawe nggunakake notasi pangerten dhaptar banjur digulung nganggo pratelan for, dhaptar sing ngemot kabeh unsur bakal digawe ing wiwitan yen notasi pangerten dhaptar digunakake. Ing tangan liyane, yen sampeyan nggunakake expression generator, saben daur ulang wis bola, unsur kui siji-siji, saéngga ngurangi jumlah memori digunakake.

Yen expression generator mung pitakonan saka fungsi, kurung babak () bisa tilar.

print(sum([i**2 for i in range(5)]))
# 30

print(sum((i**2 for i in range(5))))
# 30

print(sum(i**2 for i in range(5)))
# 30

Kanggo kacepetan pangolahan, notasi pangerten dhaptar asring luwih cepet tinimbang notasi generator nalika kabeh unsur diproses.

Nanging, nalika menehi kritik karo kabeh () utawa sembarang (), contone, asil ditemtokake nalika palsu utawa bener saiki, supaya nggunakake ekspresi generator bisa luwih cepet saka nggunakake dhaftar pangerten notasi.

Ora ana notasi pangerten tuple, nanging yen sampeyan nggunakake ekspresi generator minangka argumentasi tuple (), sampeyan bisa ngasilake tuple ing notasi pemahaman.

t = tuple(i**2 for i in range(5))

print(t)
# (0, 1, 4, 9, 16)

print(type(t))
# <class 'tuple'>