Odstranjevanje in izločanje podvojenih elementov s seznama (polja) v programu Python

Posel

V tem razdelku je opisano, kako v Pythonu ustvariti nov seznam z odstranjevanjem ali odstranjevanjem podvojenih elementov s seznama (polja).

Tu so opisane naslednje podrobnosti.

  • Odstranite podvojene elemente in ustvarite nove sezname
    • Ne ohranjajte vrstnega reda prvotnega seznama:set()
    • Ohrani vrstni red prvotnega seznama: dict.fromkeys(),sorted()
    • Dvodimenzionalno polje (seznam seznamov)
  • izločite podvojene elemente in ustvarite nov seznam
    • Ne ohranjajte vrstnega reda prvotnega seznama
    • Ohrani vrstni red prvotnega seznama
    • Dvodimenzionalno polje (seznam seznamov)

Enak koncept lahko namesto za sezname uporabimo tudi za tuple.

V naslednjem članku si oglejte

  • Če želite ugotoviti, ali ima seznam ali tuple podvojene elemente
  • Če želite izvleči elemente, ki so ali niso skupni za več seznamov namesto za en sam seznam

Upoštevajte, da lahko seznami shranjujejo različne vrste podatkov in se bistveno 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.

Odstranite podvojene elemente in ustvarite nove sezname

Ne ohranjajte vrstnega reda prvotnega seznama: set()

Če ni treba ohraniti vrstnega reda prvotnega seznama, uporabite funkcijo set(), ki ustvari množico tipa set.

Vrsta množice je podatkovna vrsta, ki nima podvojenih elementov. Če se funkciji set() posreduje seznam ali drug podatkovni tip, se podvojene vrednosti ne upoštevajo in vrne se objekt tipa set, v katerem so elementi samo edinstvene vrednosti.

Če ga želite spremeniti v tuple, uporabite funkcijo tuple().

l = [3, 3, 2, 1, 5, 1, 4, 2, 3]

print(set(l))
# {1, 2, 3, 4, 5}

print(list(set(l)))
# [1, 2, 3, 4, 5]

Seveda ga lahko pustite tudi tako, kot je nastavljen. Za več informacij o vrsti set glejte naslednji članek.

Ohrani vrstni red prvotnega seznama: dict.fromkeys(),sorted()

Če želite ohraniti vrstni red prvotnega seznama, uporabite metodo razreda fromkeys() tipa slovar ali vgrajeno funkcijo sorted().

dict.fromkeys() ustvari nov objekt slovarja, katerega ključi so seznami, kuple itd., ki so navedeni v argumentih. Če je drugi argument izpuščen, je vrednost None.

Ker ključi slovarja nimajo podvojenih elementov, se podvojene vrednosti ne upoštevajo kot v funkciji set(). Poleg tega lahko objekt slovarja posredujemo kot argument funkciji list(), da dobimo seznam, katerega elementi so ključi slovarja.

print(dict.fromkeys(l))
# {3: None, 2: None, 1: None, 5: None, 4: None}

print(list(dict.fromkeys(l)))
# [3, 2, 1, 5, 4]

Od različice Python 3.7 (CPython je 3.6) je zagotovljeno, da funkcija dict.fromkeys() ohranja zaporedje argumentov. Prejšnje različice uporabljajo vgrajeno funkcijo sorted() na naslednji način.

Za argument ključ metode sorted, ki vrne razvrščen seznam elementov, določite metodo index() za seznam tuple.

index() je metoda, ki vrne indeks vrednosti (številko elementa na seznamu), ki ga lahko določite kot ključ metode sorted(), da razvrstite seznam glede na vrstni red prvotnega seznama. Argument ključ je določen kot objekt, ki ga je mogoče klicati (callable), zato ne pišite ().

print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]

Dvodimenzionalno polje (seznam seznamov)

Pri dvodimenzionalnih nizih (seznamih seznamov) metoda, ki uporablja set() ali dict.fromkeys(), povzroči TypeError.

l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]

# l_2d_unique = list(set(l_2d))
# TypeError: unhashable type: 'list'

# l_2d_unique_order = dict.fromkeys(l_2d)
# TypeError: unhashable type: 'list'

To je zato, ker predmeti, ki jih ni mogoče pomešati, kot so seznami, ne morejo biti elementi tipa set ali ključi tipa dict.

Definirajte naslednje funkcije Vrstni red prvotnega seznama se ohrani in deluje za enodimenzionalne sezname in kupole.

def get_unique_list(seq):
    seen = []
    return [x for x in seq if x not in seen and not seen.append(x)]

print(get_unique_list(l_2d))
# [[1, 1], [0, 1], [0, 0], [1, 0]]

print(get_unique_list(l))
# [3, 2, 1, 5, 4]

Uporablja se zapis za razumevanje seznama.

Pri tem uporabljamo naslednje

  • Če je X v “X in Y” pri kratkotrajnem vrednotenju operatorja and napačen, se Y ne ovrednoti (ne izvede).
  • Metoda append() vrne None.

Če elementi prvotnega seznama seq ne obstajajo v videnem seznamu, se ovrednotita elementa then in after.
seen.append(x) se izvede in element se doda v seen.
Ker metoda append() vrne None in None je False, se metoda not seen.append(x) ovrednoti kot True.
Pogojni izraz v zapisu za razumevanje seznama postane True in se doda kot element končnega ustvarjenega seznama.

Če so elementi prvotnega seznama seq prisotni v seznamu seen, potem je x, ki ni v seznamu seen, False, pogojni izraz za izraz za razumevanje seznama pa False.
Zato niso dodani kot elementi končnega ustvarjenega seznama.

Druga metoda je nastavitev osi argumenta v funkciji NumPy np.unique(), čeprav bo rezultat razvrščen.

izločite podvojene elemente in ustvarite nov seznam

Ne ohranjajte vrstnega reda prvotnega seznama

Če želite iz prvotnega seznama izluščiti samo podvojene elemente, uporabite funkcijo collections.Counter().
Vrne zbirke.Counter (podrazred slovarja) z elementi kot ključi in številom elementov kot vrednostmi.

import collections

l = [3, 3, 2, 1, 5, 1, 4, 2, 3]

print(collections.Counter(l))
# Counter({3: 3, 2: 2, 1: 2, 5: 1, 4: 1})

Ker je podrazred slovarja, lahko funkcijo items() uporabite za pridobivanje ključev in vrednosti. Zadostuje, da se izluščijo ključi, katerih število je dve ali več.

print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]

Ohrani vrstni red prvotnega seznama

Kot je prikazano v zgornjem primeru, od različice Python 3.7 ključi zbirke.Števec ohranijo vrstni red prvotnega seznama in tako naprej.

V prejšnjih različicah zadostuje razvrščanje z ukazom sorted() in brisanje podvojenih elementov.

print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]

Če želite izločiti podvojitve, preprosto pustite elemente iz prvotnega seznama s številko dva ali več. Vrstni red se prav tako ohrani.

cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]

Dvodimenzionalno polje (seznam seznamov)

Pri dvodimenzionalnih nizih (seznamih seznamov) so možne naslednje funkcije, če se vrstni red prvotnega seznama ne ohrani in če se ohrani. Deluje tudi za enodimenzionalne sezname in kupole.

l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
def get_duplicate_list(seq):
    seen = []
    return [x for x in seq if not seen.append(x) and seen.count(x) == 2]

def get_duplicate_list_order(seq):
    seen = []
    return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]

print(get_duplicate_list(l_2d))
# [[0, 1], [1, 1]]

print(get_duplicate_list_order(l_2d))
# [[1, 1], [0, 1]]

print(get_duplicate_list(l))
# [3, 1, 2]

print(get_duplicate_list_order(l))
# [3, 2, 1]

Če želite izpisati z dvojniki, pustite elemente iz prvotnega seznama s številom dveh ali več.

print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]

Upoštevajte, da je računska zahtevnost funkcije count() O(n), zato je zgoraj prikazana funkcija, ki večkrat izvede count(), zelo neučinkovita. Morda obstaja pametnejši način.

Števec je podrazred slovarja, zato se bo pojavila napaka in ga ne boste mogli uporabiti, če funkciji zbirke.Števec() posredujete seznam ali tuple, katerega elementi so seznami ali drugi predmeti, ki jih ni mogoče pomešati.

# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'
Copied title and URL