Ugotavljanje, ali ima seznam (polje) podvojene elemente v Pythonu

Posel

V nadaljevanju je opisano, kako v programu Python ugotoviti, ali ima seznam (polje) podvojene elemente (vsi elementi so edinstveni), za vsakega od naslednjih primerov.

  • Za seznam brez seznama v elementu
  • Za sezname s seznami elementov (dvodimenzionalna polja, seznami seznamov itd.)

V naslednjem članku si oglejte, kako odstraniti ali izločiti podvojene elemente s seznama.

Upoštevajte, da lahko seznami shranjujejo različne vrste podatkov in se strogo razlikujejo od polj. Če želite z nizi ravnati v procesih, ki zahtevajo velikost pomnilnika in pomnilniške naslove ali numerično obdelavo velikih podatkov, uporabite array (standardna knjižnica) ali NumPy.

ugotovi, ali so na seznamu podvojeni elementi (če element nima seznama)

Če element nima posodobljivega objekta, na primer seznama, uporabite konstruktor set() tipa set.

Vrsta množice je podatkovna vrsta, ki nima podvojenih elementov. Ko konstruktorju set() posredujemo seznam, se podvojene vrednosti ne upoštevajo in vrne se objekt tipa set, katerega elementi so samo edinstvene vrednosti.

S pomočjo vgrajene funkcije len() dobimo in primerjamo število elementov v tem objektu tipa množica in izvirnem seznamu.

  • Če je število elementov enako, v prvotnem seznamu ni podvojenih elementov.
  • Podvojeni elementi so vključeni v prvotni seznam, če je število elementov drugačno.

Funkcije, ki vrnejo false, če ni podvojenih elementov, in true, če so podvojeni elementi, so naslednje

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

Primer je seznam, vendar lahko enako funkcijo uporabimo tudi pri tuplih.

Spremenljivi (posodabljajoči se) objekti, kot so seznami, ne morejo biti elementi tipa množica. Zato bodo seznami s seznami kot elementi (dvodimenzionalna polja, seznami seznamov itd.) povzročili TypeError. Protiukrep je prikazan spodaj.

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

ugotovi, ali so na seznamu podvojeni elementi (če ima element seznam)

V primeru seznama s seznamom elementov (kot je seznam seznamov) lahko z naslednjimi funkcijami ugotovite, ali obstajajo podvojeni elementi.

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

Namesto funkcije set() se z zapisom za razumevanje seznama ustvari seznam, katerega elementi so samo edinstvene vrednosti, število elementov pa se primerja. Za podrobnosti glejte naslednji članek.

Ta funkcija velja tudi za sezname, ki nimajo seznama elementov.

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

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

Dosedanji primer je ugotavljanje, ali se seznam elementov podvaja (vsebuje isti seznam).

Ali se elementi vsakega seznama prekrivajo, lahko ugotovimo, ko prvotni seznam sploščimo na eno dimenzijo.

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

V tem primeru je za izravnavo seznama uporabljena funkcija sum(), lahko pa uporabite tudi itertools.chain.from_iterable(). Poleg tega je treba pri izravnavi seznama treh ali več dimenzij opredeliti novo funkcijo.

Copied title and URL