Kuamua ikiwa orodha (safu) ina vipengee vya nakala kwenye Python

Biashara

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.

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.

Copied title and URL