Yafuatayo ni maelezo ya jinsi ya kuamua ikiwa orodha (safu) ina vipengee vinavyorudiwa (vipengee vyote ni vya kipekee/kipekee) katika Python, kwa kila moja ya visa vifuatavyo.
- Kwa orodha isiyo na orodha katika kipengele
- Kwa orodha zilizo na orodha ya vipengele (safu zenye pande mbili, orodha za orodha, n.k.)
Tazama makala ifuatayo kuhusu jinsi ya kuondoa au kutoa vipengele vinavyorudiwa kutoka kwenye orodha.
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.
Amua ikiwa kuna nakala mbili kwenye orodha (ikiwa kipengele hakina orodha)
Ikiwa kipengele hakina kitu kinachoweza kusasishwa kama vile orodha, tumia kijenzi set() cha aina ya seti.
- INAYOHUSIANA:Weka shughuli (k.m., kuamua seti za muungano, seti za bidhaa, na vifaa vidogo) na aina ya seti ya Python
Aina ya seti ni aina ya data ambayo haina vipengele vya nakala. Orodha inapopitishwa kwa mjenzi set(), thamani rudufu hupuuzwa na kitu cha aina kimewekwa chenye thamani za kipekee tu vipengele vinaporejeshwa.
Idadi ya vipengele katika kitu cha aina hii ya kuweka na orodha ya asili hupatikana na ikilinganishwa kwa kutumia len ya kazi iliyojengwa ndani ().
- Ikiwa idadi ya vipengele ni sawa, hakuna vipengele vinavyorudiwa kwenye orodha asili
- Vipengele vinavyorudiwa vimejumuishwa kwenye orodha asili ikiwa idadi ya vipengee ni tofauti
Kazi zinazorejesha kuwa sivyo ikiwa hakuna vipengele vilivyorudiwa na kweli ikiwa kuna vipengele vinavyorudiwa ni kama ifuatavyo
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
Mfano ni orodha, lakini kazi sawa inaweza kutumika na tuples.
Vitu vinavyoweza kugeuzwa (vinavyoweza kusasishwa) kama vile orodha haviwezi kuwa vipengele vya seti ya aina. Kwa hivyo, orodha zilizo na orodha kama vipengee (safu zenye pande mbili, orodha za orodha, n.k.) zitasababisha TypeError. Hatua ya kukabiliana imeonyeshwa hapa chini.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Amua ikiwa kuna nakala mbili kwenye orodha (ikiwa kipengele kina orodha)
Katika kesi ya orodha iliyo na orodha ya vipengee (kama vile orodha ya orodha), vitendaji vifuatavyo vinaweza kutumiwa kubaini ikiwa kuna nakala mbili.
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
Badala ya set(), nukuu ya ufahamu wa orodha hutoa orodha ambayo vipengele vyake ni tunu za kipekee, na idadi ya vipengele inalinganishwa. Tazama makala ifuatayo kwa maelezo zaidi.
Chaguo hili la kukokotoa pia ni halali kwa orodha ambazo hazina orodha ya vipengele.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Mfano hadi sasa ni uamuzi wa ikiwa orodha ya vipengele imerudiwa (ina orodha sawa).
Ikiwa vipengee vya kila orodha vinapishana vinaweza kubainishwa baada ya kubandika orodha asili kwa kipimo kimoja.
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
Hapa, sum() inatumika kubana orodha, lakini itertools.chain.from_iterable() pia inaweza kutumika. Kwa kuongeza, wakati wa kutengeneza orodha ya vipimo vitatu au zaidi, ni muhimu kufafanua kazi mpya.