Eftirfarandi er lýsing á því hvernig á að ákvarða hvort listi (fylki) hafi afrita þætti (allir þættir eru einstakir/einstakir) í Python, fyrir hvert af eftirfarandi tilfellum.
- Fyrir lista án lista í þættinum
- Fyrir lista með lista yfir þætti (tvívíð fylki, lista yfir lista osfrv.)
Sjá eftirfarandi grein um hvernig á að fjarlægja eða draga afrita þætti úr lista.
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.
Ákvarða hvort það séu tvítekin þættir á listanum (ef þátturinn hefur engan lista)
Ef þátturinn er ekki með uppfæranlegan hlut eins og lista, notaðu smiðjusett() af gerð mengismengis.
Setjategundin er gagnategund sem hefur enga afrita þætti. Þegar listi er sendur í smiðjusettið() eru tvöföld gildi hunsuð og hlutur af gerðinni sem hefur aðeins einstök gildi sem þætti er skilað.
Fjöldi þátta í þessari mengunartegund hlut og upprunalega listanum er fenginn og borinn saman með því að nota innbyggða fallið len().
- Ef fjöldi þátta er jafn eru engir tvíteknir þættir í upprunalega listanum
- Tvíteknir þættir eru með í upprunalega listanum ef fjöldi þátta er mismunandi
Aðgerðir sem skila ósönnum ef það eru engir tvíteknir þættir og sannir ef það eru tvíteknir þættir eru sem hér segir
def has_duplicates(seq):
return len(seq) != len(set(seq))
l = [0, 1, 2]
print(has_duplicates(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates(l))
# True
Dæmið er listi, en sömu aðgerð er hægt að nota með tuples.
Breytanlegir (uppfæranlegir) hlutir eins og listar geta ekki verið þættir af gerð setts. Þess vegna munu listar með listum sem þætti (tvívíð fylki, listar yfir lista osfrv.) leiða til TypeError. Mótvægisráðstöfunin er sýnd hér að neðan.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Ákvarða hvort það séu tvítekin þættir á listanum (ef þátturinn er með lista)
Ef um er að ræða lista með lista yfir þætti (eins og lista yfir lista) er hægt að nota eftirfarandi aðgerðir til að ákvarða hvort það séu tvíteknir þættir.
def has_duplicates2(seq):
seen = []
unique_list = [x for x in seq if x not in seen and not seen.append(x)]
return len(seq) != len(unique_list)
l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False
l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True
Í stað þess að setja() myndar listaskilningurinn lista þar sem þættirnir eru aðeins einstök gildi og fjöldi þátta er borinn saman. Sjá eftirfarandi grein fyrir frekari upplýsingar.
Þessi aðgerð er einnig gild fyrir lista sem hafa ekki lista yfir þætti.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Dæmið hingað til er ákvörðun um hvort listi yfir þætti sé tvítekinn (inniheldur sama lista).
Hvort þættir hvers lista skarast er hægt að ákvarða eftir að upprunalega listann hefur verið flettur út í eina vídd.
l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]
print(has_duplicates(sum(l_2d, [])))
# False
l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True
Hér er sum() notað til að fletja út listann, en einnig er hægt að nota itertools.chain.from_iterable(). Að auki, þegar þú flettir út lista yfir þrjár eða fleiri víddir, er nauðsynlegt að skilgreina nýtt fall.