Kuchimba na kubadilisha vitu ambavyo vinakidhi masharti ya orodha (safu) ya kamba kwenye Python.

Biashara

Ili kutoa orodha mpya kutoka kwa orodha (safu) ambayo vipengele vyake ni mifuatano, kwa kutoa tu vipengele vya mifuatano vinavyokidhi hali fulani, au kwa kufanya vibadala, ubadilishaji, n.k., tumia ufahamu wa orodha.

Baada ya maelezo mafupi ya ufahamu wa orodha, yaliyomo yafuatayo yanaelezewa na msimbo wa sampuli.

  • Uchimbaji kulingana na ikiwa mfuatano maalum umejumuishwa au la (sehemu inayolingana)
  • Badilisha mfuatano maalum
  • Toa kwa kuanza au kutoanza na mfuatano maalum
  • Toa kwa kumalizia au kutomalizia na mfuatano maalum
  • Kuhukumiwa na kutolewa kwa kesi
  • Badilisha herufi kubwa na ndogo
  • Huamua ikiwa herufi za kialfabeti au nambari zinatumika na kuzitoa
  • Hali nyingi
  • (kompyuta) kujieleza mara kwa mara

Kumbuka kuwa orodha zinaweza kuhifadhi aina tofauti za data na ni tofauti kabisa na safu. Ikiwa ungependa kushughulikia safu katika michakato inayohitaji ukubwa wa kumbukumbu na anwani za kumbukumbu au usindikaji wa nambari za data kubwa, tumia safu (maktaba ya kawaida) au NumPy.

nukuu ya kujumuisha orodha

Wakati wa kuunda orodha mpya kutoka kwa orodha, ufahamu wa orodha ni rahisi kuandika kuliko kwa vitanzi.

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

Ikiwa kipengee kitachaguliwa tu na usemi wa masharti, hauchakatwa na usemi, kwa hivyo inachukua fomu ifuatayo.

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

Ikiwa usemi wa masharti ukifanywa kuwa usemi wa ikiwa si wa masharti, unakuwa kanusho, na vipengele ambavyo havikidhi usemi wa masharti vinaweza kutolewa.

Ina mfuatano maalum (sehemu inayolingana) \ Haina:in

Katika “kamba mahususi katika mfuatano wa asili”, hurejesha Kweli ikiwa mfuatano wa asili una mfuatano mahususi. Huu ni usemi wenye masharti.

Kukanusha kwa ndani kunafanywa na kutoingia.

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']

l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']

Badilisha mfuatano maalum

Ikiwa ungependa kubadilisha mfuatano wa vipengele vya orodha, tumia njia ya mfuatano replace() kwa kila kipengele kwenye nukuu ya ufahamu wa orodha.

Ikiwa hakuna mfuatano wa kubadilishwa, hakuna haja ya kuchagua kipengele katika usemi wa if masharti kwa sababu hautabadilishwa kwa kutumia replace().

l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']

Ikiwa ungependa kubadilisha kipengele kizima kilicho na mfuatano mahususi, kitoe pamoja na ukichakate na opereta wa tatu. Opereta ya ternary imeandikwa kwa fomu ifuatayo.
True Value if Conditional Expression else False Value

Ni sawa ikiwa sehemu ya usemi ya nukuu ya ufahamu wa orodha ni opereta wa mwisho.

l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']

Ufuatao ni muhtasari wa matokeo, umefungwa kwenye mabano. Ikiwa hujazoea kutumia mabano, inaweza kuwa rahisi kuelewa na kuepuka makosa. Kisarufi, hakuna tatizo hata ukiandika mabano.

[('ZZZ' if ('XXX' in s) else s) for s in l]

Matumizi ya in kama hali yanachanganya na nukuu ya ufahamu wa orodha, lakini si vigumu ikiwa unafahamu aina ya kisintaksia ya nukuu za ufahamu wa orodha na waendeshaji wa mwisho.

Huanza na mfuatano maalum \ haianzii:startswith()

Njia ya mfuatano startswith() inarudi kuwa kweli ikiwa mfuatano unaanza na mfuatano uliobainishwa kwenye hoja.

l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']

l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']

Inaisha na mfuatano maalum wa herufi \ sio mwisho:endswith()

Mbinu ya mfuatano endswith() inarudisha kweli ikiwa mfuatano utaisha na mfuatano uliobainishwa kwenye hoja.

l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']

l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']

Kuhukumiwa na kutolewa kwa kesi

Mbinu za mfuatano isupper(),islower() zinaweza kutumika kubainisha kama mfuatano wote ni wa juu au wa herufi ndogo.

l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']

Badilisha herufi kubwa na ndogo

Ikiwa unataka kubadilisha herufi zote kuwa herufi kubwa au ndogo, tumia njia za kamba upper() na lower(). Mbinu zingine ni pamoja na herufi kubwa (), ambayo ina herufi kubwa ya kwanza pekee, na swapcase(), ambayo hubadilisha herufi kubwa na ndogo.

Kama ilivyo katika mfano mbadala hapo juu, tumia opereta wa tatu ikiwa unataka kuchakata vipengele vinavyokidhi hali hiyo pekee.

l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']

l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']

Huamua ikiwa herufi za kialfabeti au nambari zinatumika na kuzitoa

Mbinu za mfuatano ni alpha() na isnumeric() zinaweza kutumika kubainisha kama mfuatano ni wa alfabeti, nambari, n.k.

l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']

l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']

Hali nyingi

Sehemu ya usemi wa masharti ya ufahamu wa orodha inaweza kuwa hali nyingi. Hali mbaya “sio” pia inaweza kutumika.

Unapotumia maneno matatu au zaidi yenye masharti, ni salama kuambatisha kila kikundi kwenye mabano () kwa sababu matokeo yatatofautiana kulingana na mpangilio.

l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']

l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']

(kompyuta) kujieleza mara kwa mara

Semi za kawaida huruhusu uchakataji unaonyumbulika sana.

Kipengee cha mechi kinachorejeshwa na re.match() kinapolingana kila wakati hubainika kuwa kweli kinapotathminiwa kwa usemi wa masharti. Ikiwa hailingani, itarejesha Hakuna, jambo ambalo si kweli katika usemi wa masharti. Kwa hivyo, ikiwa ungependa kutoa vipengele vinavyolingana na usemi wa kawaida pekee, tumia tu re.match() kwenye sehemu ya usemi wa masharti ya usemi wa ufahamu wa orodha kama hapo awali.

import re

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']

re.sub(), ambayo inachukua nafasi ya sehemu inayolingana ya usemi wa kawaida, pia ni muhimu. Ili kutoa na kubadilisha tu vitu vilivyolingana, ongeza tu “ikiwa usemi wa masharti”.

l_re_sub_all = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']

l_re_sub = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']