Þessi hluti lýsir því hvernig á að búa til nýjan lista í Python með því að fjarlægja eða draga út afrita þætti úr lista (fylki).
Eftirfarandi smáatriðum er lýst hér.
- Fjarlægðu afrita þætti og búðu til nýjar skráningar
- Ekki varðveita röð upprunalegu skráningarinnar:
set()
- Viðheldur röð upprunalegu skráningarinnar:
dict.fromkeys()
,sorted()
- Tvívítt fylki (listi yfir lista)
- Ekki varðveita röð upprunalegu skráningarinnar:
- Dragðu út afrita þætti og búðu til nýjan lista
- Ekki varðveita röð upprunalegu skráningarinnar
- Viðheldur röð upprunalegu skráningarinnar
- Tvívítt fylki (listi yfir lista)
Sama hugtak er hægt að nota á túlla í stað lista.
Sjá eftirfarandi grein fyrir
- Ef þú vilt ákvarða hvort listi eða tuple hafi afrita þætti
- Ef þú vilt draga út þætti sem eru algengir eða ekki algengir meðal margra skráninga í stað einnar skráningar
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.
Fjarlægðu afrita þætti og búðu til nýjar skráningar
Ekki varðveita röð upprunalegu skráningarinnar:set()
Ef það er engin þörf á að varðveita röð upprunalega listans, notaðu set(), sem býr til tegundarsett.
Setjategundin er gagnategund sem hefur enga afrita þætti. Þegar listi eða önnur gagnategund er send til set() eru tvöföld gildi hunsuð og hlutur af tegund setti er skilað þar sem aðeins einstök gildi eru þættir.
Ef þú vilt gera það að tuple, notaðu tuple().
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(set(l))
# {1, 2, 3, 4, 5}
print(list(set(l)))
# [1, 2, 3, 4, 5]
Auðvitað er líka hægt að skilja það eftir sem sett. Sjá eftirfarandi grein fyrir frekari upplýsingar um tegundasettið.
Viðheldur röð upprunalegu skráningarinnar:dict.fromkeys(),sorted()
Ef þú vilt varðveita röð upprunalega listans, notaðu flokkaaðferðina fromkeys() af orðabókargerðinni eða innbyggðu fallinu sorted().
dict.fromkeys() býr til nýjan orðabókarhlut þar sem lyklarnir eru listar, tuples o.s.frv. sem tilgreindir eru í röksemdum. Ef seinni röksemdinni er sleppt er gildið Ekkert.
Þar sem orðabókarlyklar eru ekki með afrita þætti, eru tvöföld gildi hunsuð eins og í set(). Að auki er hægt að senda orðabókarhlut sem rök til list() til að fá lista þar sem þættirnir eru orðabókarlyklar.
print(dict.fromkeys(l))
# {3: None, 2: None, 1: None, 5: None, 4: None}
print(list(dict.fromkeys(l)))
# [3, 2, 1, 5, 4]
Það hefur verið tryggt síðan Python 3.7 (CPython er 3.6) að dict.fromkeys() varðveitir röð röksemdaröðarinnar. Fyrri útgáfur nota innbyggðu fallið sorted() sem hér segir.
Tilgreindu list tuple method index() fyrir rifulykil sorted, sem skilar flokkuðum lista af þáttum.
index() er aðferð sem skilar vísitölu gildisins (númer staksins á listanum), sem hægt er að tilgreina sem lykilinn á sorted() til að raða listanum út frá röð upprunalega listans. Vísindalykillinn er tilgreindur sem kallanlegur (kallanlegur) hlutur, svo ekki skrifa ().
print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]
Tvívítt fylki (listi yfir lista)
Fyrir tvívíddar fylki (lista yfir lista) leiðir aðferðin sem notar set() eða dict.fromkeys() til TypeError.
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
# l_2d_unique = list(set(l_2d))
# TypeError: unhashable type: 'list'
# l_2d_unique_order = dict.fromkeys(l_2d)
# TypeError: unhashable type: 'list'
Þetta er vegna þess að hlutir sem ekki er hægt að hashnýta eins og listar geta ekki verið þættir af tegundarsetti eða lyklar af gerðinni dict.
Skilgreindu eftirfarandi aðgerðir Röð upprunalega listans er varðveitt og virkar fyrir einvíddar lista og túlla.
def get_unique_list(seq):
seen = []
return [x for x in seq if x not in seen and not seen.append(x)]
print(get_unique_list(l_2d))
# [[1, 1], [0, 1], [0, 0], [1, 0]]
print(get_unique_list(l))
# [3, 2, 1, 5, 4]
Notast er við listaskilning.
Hér notum við eftirfarandi
- Ef X í „X og Y“ er rangt í skammhlaupsmati og rekstraraðila, þá er Y ekki metið (ekki keyrt).
- Append() aðferðin skilar Engum.
Ef þættir upprunalega lista seq eru ekki til í seen, þá og eftir eru metnir.
seen.append(x) er keyrt og þættinum bætt við seen.
Vegna þess að append() aðferðin skilar None og None is False, er not seen.append(x) metið á True.
Skilyrta tjáningin í listaskilningsmerkingunni verður True og er bætt við sem þætti í endanlegum mynduðum lista.
Ef þættir upprunalega lista seq eru til staðar í seen, þá er x not in seen False, og skilyrta tjáningin fyrir listaskilningstjáninguna er False.
Þess vegna er þeim ekki bætt við sem þáttum í endanlegum mynduðum lista.
Önnur aðferð er að stilla röksemdaásinn í fallinu NumPy np.unique(), þó niðurstaðan verði flokkuð.
Dragðu út afrita þætti og búðu til nýjan lista
Ekki varðveita röð upprunalegu skráningarinnar
Til að draga aðeins afrita þætti úr upprunalega listanum, notaðu collections.Counter().
Skilar safni.Counter (undirflokkur orðabókar) með þættina sem lykla og fjölda þátta sem gildi.
import collections
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(collections.Counter(l))
# Counter({3: 3, 2: 2, 1: 2, 5: 1, 4: 1})
Þar sem það er undirflokkur orðabókar er hægt að nota items() til að sækja lykla og gildi. Það er nóg að draga út lykla sem eru tveir eða fleiri.
print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]
Viðheldur röð upprunalegu skráningarinnar
Eins og sýnt er í dæminu hér að ofan, frá Python 3.7, halda lyklunum af söfnum.Counter röð upprunalega lista og svo framvegis.
Í fyrri útgáfum er nóg að flokka með sorted() sem og að eyða tvíteknum þáttum.
print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]
Ef þú vilt draga út afrit eins og þau eru skaltu einfaldlega skilja þætti úr upprunalega listanum eftir með tölunni tveimur eða fleiri. Röðin er einnig varðveitt.
cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]
Tvívítt fylki (listi yfir lista)
Fyrir tvívíddar fylki (lista yfir lista) eru eftirfarandi aðgerðir mögulegar þegar röð upprunalega listans er ekki haldið og þegar það er haldið, í sömu röð. Það virkar líka fyrir einvíddar lista og túlla.
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
def get_duplicate_list(seq):
seen = []
return [x for x in seq if not seen.append(x) and seen.count(x) == 2]
def get_duplicate_list_order(seq):
seen = []
return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]
print(get_duplicate_list(l_2d))
# [[0, 1], [1, 1]]
print(get_duplicate_list_order(l_2d))
# [[1, 1], [0, 1]]
print(get_duplicate_list(l))
# [3, 1, 2]
print(get_duplicate_list_order(l))
# [3, 2, 1]
Ef þú vilt draga út með afritum skaltu skilja þætti frá upprunalega listanum eftir með talningu upp á tvo eða fleiri.
print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]
Athugaðu að þar sem útreikningsflækjustig count() er O(n), þá er fallið sem sýnt er hér að ofan sem endurtekið keyrir count() mjög óhagkvæmt. Það gæti verið skynsamlegri leið.
Counter er undirflokkur orðabókar, þannig að ef þú sendir lista eða tuple þar sem þættirnir eru listar eða aðrir hlutir sem ekki er hægt að hashnýta til safns.Counter(), mun villa koma upp og þú munt ekki geta notað hann.
# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'