Til að búa til nýjan lista úr lista (fylki) þar sem þættirnir eru strengir, með því að draga aðeins út strengjaeiningar sem uppfylla ákveðin skilyrði, eða með því að framkvæma útskipti, umbreytingar o.s.frv., notaðu listaskilning.
Eftir stutta útskýringu á listaskilningi er eftirfarandi innihald útskýrt með sýnishornskóða.
- Útdráttur byggist á því hvort ákveðinn strengur sé innifalinn eða ekki (samsvörun að hluta)
- Skiptu um ákveðinn streng
- Dragðu út með því að byrja eða byrja ekki á ákveðnum streng
- Dragðu út með því að enda eða enda ekki á ákveðnum streng
- Dæmdur og dreginn út eftir málum
- Umbreyttu hástöfum og lágstöfum
- Ákveður hvort stafrófs- eða tölustafir séu notaðir og dregur þá út
- Mörg skilyrði
- (tölva) regluleg tjáning
Athugaðu að listar geta geymt mismunandi tegundir gagna og eru algjörlega frábrugðnar fylkjum. Ef þú vilt meðhöndla fylki í ferlum sem krefjast minnisstærðar og minnisfönga eða tölulegrar vinnslu stórra gagna, notaðu fylki (venjulegt bókasafn) eða NumPy.
- skráningarmerki
- Inniheldur ákveðinn streng (samsvörun að hluta) \ Inniheldur ekki:in
- Skiptu um ákveðinn streng
- Byrjar á ákveðnum streng \ byrjar ekki:startswith()
- Endar með ákveðnum stafastreng \ ekki enda:endswith()
- Dæmdur og dreginn út eftir málum
- Umbreyttu hástöfum og lágstöfum
- Ákveður hvort stafrófs- eða tölustafir séu notaðir og dregur þá út
- Mörg skilyrði
- (tölva) regluleg tjáning
skráningarmerki
Þegar nýr listi er búinn til úr lista er einfaldara að skrifa listaskilning en lykkjur.
[expression for any variable name in iterable object if conditional expression]
Ef þátturinn á aðeins að vera valinn með skilyrtri tjáningu, er hann ekki unnin af segð, þannig að hann tekur eftirfarandi form
[variable name for variable name in original list if conditional expression]
Ef ef skilyrt tjáningin er gerð að ef ekki skilyrtri tjáningu verður hún að neitun og hægt er að draga út þætti sem uppfylla ekki skilyrtu tjáninguna.
Inniheldur ákveðinn streng (samsvörun að hluta) \ Inniheldur ekki:in
Í „sérstakur strengur í upprunalegum streng“, skilar True ef upprunalegi strengurinn inniheldur tiltekna strenginn. Þetta er skilyrt tjáning.
Afneitunin á inn er gerð með ekki inn.
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']
Skiptu um ákveðinn streng
Ef þú vilt skipta um streng af listaeiningum, notaðu strengjaaðferðina replace() fyrir hvern þátt í listaskilningi.
Ef það er enginn strengur sem á að skipta út er engin þörf á að velja þáttinn í if skilyrt tjáningu því honum verður ekki breytt með því að nota replace().
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Ef þú vilt skipta út heilu frumefni sem inniheldur ákveðinn streng skaltu draga það út með inn og vinna úr því með þrískiptingunni. Þrjár rekstraraðili er skrifaður á eftirfarandi formi.True Value if Conditional Expression else False Value
Það er í lagi ef tjáningarhluti listaskilningsins er þrískiptur rekstraraðili.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Eftirfarandi er samantekt á niðurstöðunum, innan sviga. Ef þú ert ekki vanur að nota sviga gæti verið auðveldara að skilja og forðast mistök. Málfræðilega er ekkert vandamál þó þú skrifir sviga.
[('ZZZ' if ('XXX' in s) else s) for s in l]
Notkunin á sem skilyrði er ruglingsleg við listaskilningsnátnunina í, en það er ekki erfitt ef þú ert meðvitaður um setningafræðilegt form listaskilningsnátunar og þrískiptra aðgerða.
Byrjar á ákveðnum streng \ byrjar ekki:startswith()
Strengjaaðferðin startswith() skilar satt ef strengurinn byrjar á strengnum sem tilgreindur er í viðfangsefninu.
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']
Endar með ákveðnum stafastreng \ ekki enda:endswith()
Strengjaaðferðin endswith() skilar satt ef strengurinn endar með strengnum sem tilgreindur er í viðfangsefninu.
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']
Dæmdur og dreginn út eftir málum
Strengjaaðferðirnar isupper(),islower() er hægt að nota til að ákvarða hvort strengur er allur hástafur eða lágstafur.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Umbreyttu hástöfum og lágstöfum
Ef þú vilt breyta öllum stöfum í hástafi eða lágstafi skaltu nota strengjaaðferðirnar upper() og lower(). Aðrar aðferðir eru meðal annars stórstafur(), sem skrifar aðeins fyrsta stafinn með hástöfum, og swapcase(), sem skiptir um hástöfum og lágstöfum.
Eins og í staðsetningardæminu hér að ofan, notaðu þrískiptinguna ef þú vilt vinna aðeins þætti sem uppfylla skilyrðið.
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']
Ákveður hvort stafrófs- eða tölustafir séu notaðir og dregur þá út
Hægt er að nota strengjaaðferðirnar isalpha() og isnumeric() til að ákvarða hvort strengur sé allur í stafrófsröð, tölustafur o.s.frv.
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']
Mörg skilyrði
Skilyrt tjáningarhluti listaskilnings geta verið mörg skilyrði. Einnig er hægt að nota neikvæð „ekki“ skilyrði.
Þegar notaðar eru þrjár eða fleiri skilyrtar orðatiltæki er öruggara að setja hvern hóp innan sviga () því niðurstaðan er breytileg eftir röð.
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']
(tölva) regluleg tjáning
Reglulegar tjáningar leyfa mjög sveigjanlega vinnslu.
Samsvörunarhluturinn sem re.match() skilar þegar hann passar er alltaf ákvarðaður að vera satt þegar hann er metinn með skilyrtri tjáningu. Ef það passar ekki skilar það Engum, sem er rangt í skilyrtu tjáningunni. Svo, ef þú vilt draga aðeins út þættina sem passa við reglulegu tjáninguna, notaðu bara re.match() á skilyrta tjáningarhluta listaskilningstjáningarinnar eins og áður.
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(), sem kemur í stað samsvarandi hluta reglulegrar tjáningar, er einnig gagnlegt. Til að draga út og skipta aðeins út samsvarandi þáttum skaltu bara bæta við „ef skilyrt tjáning“.
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']