Tespîtkirin ka navnîşek (array) di Python de hêmanên dubare hene

Dikan

Ya jêrîn şiroveyek e ku meriv çawa destnîşan dike ka navnîşek (array) di Python-ê de hêmanên dubare hene (hemû hêman yekta / yekta ne) ji bo her yek ji rewşên jêrîn.

  • Ji bo navnîşek ku di elementê de navnîşek tune
  • Ji bo lîsteyên bi navnîşên hêmanan (rêzikên du-alî, navnîşên navnîşan, hwd.)

Gotara jêrîn li ser ka meriv çawa hêmanên dubare ji navnîşek derxîne an derxe binêre.

Bala xwe bidinê ku navnîş dikarin cûreyên cûda yên daneyan hilînin û bi tundî ji rêzan cûda ne. Heke hûn dixwazin di pêvajoyên ku hewceyê mezinahiya bîranînê û navnîşanên bîranînê an jî pêvajoyek hejmarî ya daneyên mezin hewce dikin de rêzan bi rê ve bibin, array (pirtûkxaneya standard) an NumPy bikar bînin.

Tesbît bike ka di navnîşê de hêmanên dubare hene (heke hêman lîsteyek tune be)

Ger hêman ne xwediyê tiştek nûvekirî wekî navnîşek be, sazkera çêker () ya celebê setê bikar bînin.

Tîpa set cureyek daneyê ye ku hêmanên wê yên dubare tune. Dema ku navnîşek ji sazkera çêker re derbas dibe (), nirxên dubare têne paşguh kirin û tiştek celebek ku tenê wekî hêman nirxên yekta hene tê vegerandin.

Hejmara hêmanên di vê cîhê tîpa setê û navnîşa orîjînal de bi karanîna fonksiyona çêkirî ya len(-ê) têne wergirtin û berhev kirin.

  • Ger hejmara hêmanan wekhev be, di navnîşa orîjînal de hêmanên dubare tune
  • Ger hejmara hêmanan cuda be, hêmanên dubare di navnîşa orîjînal de cih digirin

Fonksiyonên ku heke hêmanên dubare nebin xelet vedigerin û heke hêmanên dubare hebin rast in wiha ne

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

Nimûne lîsteyek e, lê heman fonksiyon dikare bi tîpan re were bikar anîn.

Tiştên guhêrbar (nûvebar) ên wekî navnîşan nikarin hêmanên cûrbecûr bin. Ji ber vê yekê, lîsteyên bi lîsteyên wekî hêmanan (rêzikên du-alî, navnîşên navnîşan, hwd.) dê di TypeError de encam bidin. Tevgera dijber li jêr tê nîşandan.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Diyar bike ka di navnîşê de hêmanên dubare hene (heke hêman navnîşek hebe)

Di mijara navnîşek bi navnîşek hêmanan de (wek navnîşek navnîşan), fonksiyonên jêrîn dikarin werin bikar anîn da ku diyar bikin ka hêmanên dubare hene.

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

Li şûna set(), nîşana têgihîştina navnîşê navnîşek ku hêmanên wê tenê nirxên bêhempa ne diafirîne, û hejmara hêmanan tê berhev kirin. Ji bo hûragahiyan li gotara jêrîn binêre.

Ev fonksiyon ji bo navnîşên ku navnîşek hêmanan tune ne jî derbasdar e.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

Mînaka heya niha tespîtkirina ka navnîşa hêmanan dubare ye (eynî navnîşê dihewîne).

Ma hêmanên her lîsteyê li hev dikevin, piştî ku navnîşa orîjînal li yek dimenî were xêzkirin dikare were destnîşankirin.

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

Li vir, sum() tê bikar anîn da ku navnîşê bihejîne, lê itertools.chain.from_iterable() jî dikare were bikar anîn. Digel vê yekê, dema ku navnîşek sê an jî zêdetir dimenan dakêşin, pêdivî ye ku fonksiyonek nû were destnîşankirin.

Copied title and URL