Come verificare se un valore esiste in Python list in modo veloce

Jinku Hu 30 gennaio 2022
  1. in metodo per verificare l’esistenza di valori nella lista Python
  2. Convertire la lista da impostare e poi fare il controllo di appartenenza in Python
  3. Confronto delle prestazioni tra la lista e il controllo dell’appartenenza all’insieme dei membri
  4. Conclusione del confronto delle prestazioni
Come verificare se un valore esiste in Python list in modo veloce

Introdurremo diversi metodi per verificare se un valore esiste in Python e confrontare le loro prestazioni.

I metodi includono,

  1. Metodo di controllo dell’appartenenza - metodo in Method per verificare se il valore esiste
  2. Convertire la lista in set e poi usare il metodo di controllo dei membri in.

in metodo per verificare l’esistenza di valori nella lista Python

in è il modo corretto per fare il controllo di appartenenza nella lista Python, set, dizionario o altri oggetti Python iterabili.

>>> testList = [1, 2, 3, 4]
>>> 2 in testList
True
>>> 6 in testList
False

Convertire la lista da impostare e poi fare il controllo di appartenenza in Python

La lista di controllo dei membri potrebbe essere inefficiente se la dimensione della lista aumenta, specialmente se nella lista esistono elementi duplicati.

Python set è un tipo di dati migliore in questo scenario per fare il controllo di appartenenza perché contiene solo valori univoci.

Confronto delle prestazioni tra la lista e il controllo dell’appartenenza all’insieme dei membri

Confronteremo le differenze di performance in quattro situazioni,

  1. La lista originale ha valori unici, e il valore selezionato esiste nella lista
  2. La lista originale ha valori unici, e il valore selezionato non esiste nella lista
  3. La lista originale ha valori duplicati, e il valore selezionato esiste nella lista
  4. La lista originale ha solo valori duplicati, e il valore selezionato non esiste nella lista

La lista originale ha solo valori univoci, e il valore selezionato esiste nella lista

Python se il valore esiste nella lista - i valori univoci nella lista e il valore da controllare esiste nella lista

from itertools import chain
import perfplot
import numpy as np


def setupTest(n):
    a = np.arange(n)
    np.random.shuffle(a)
    randomlist = a[: n // 2].tolist()
    randomvalue = randomlist[len(randomlist) // 2]
    return [randomlist, randomvalue]


def inListMethod(L):
    x, y = L
    return y in x


def inSetMethod(L):
    x, y = L
    x = set(x)
    return y in x


perfplot.show(
    setup=setupTest,
    kernels=[inListMethod, inSetMethod],
    labels=["in list", "in set"],
    n_range=[2 ** k for k in range(1, 20)],
    xlabel="Data Length",
    title="unique values in list and to-be-checked value exists in the list",
    logx=True,
    logy=True,
)

La lista originale ha solo valori univoci, e il valore selezionato non esiste nella lista

Python se il valore esiste nella lista - i valori univoci nella lista e il valore da controllare non esiste nella lista

from itertools import chain
import perfplot
import numpy as np


def setupTest(n):
    a = np.arange(n)
    np.random.shuffle(a)
    randomlist = a[: n // 2].tolist()
    randomvalue = n + 1
    return [randomlist, randomvalue]


def inListMethod(L):
    x, y = L
    return y in x


def inSetMethod(L):
    x, y = L
    x = set(x)
    return y in x


perfplot.show(
    setup=setupTest,
    kernels=[inListMethod, inSetMethod],
    labels=["in list", "in set"],
    n_range=[2 ** k for k in range(1, 20)],
    xlabel="Data Length",
    title="unique values in list and to-be-checked value does not exist in the list",
    logx=True,
    logy=True,
)

La lista originale ha valori duplicati, e il valore selezionato esiste nella lista

Python se il valore esiste nella lista - i valori duplicati nella lista e il valore da controllare esiste nella lista

from itertools import chain
import perfplot
import numpy as np


def setupTest(n):
    a = np.arange(n)
    np.random.shuffle(a)
    randomlist = np.random.choice(n, n // 2).tolist()
    randomvalue = randomlist[len(randomlist) // 2]
    return [randomlist, randomvalue]


def inListMethod(L):
    x, y = L
    return y in x


def inSetMethod(L):
    x, y = L
    x = set(x)
    return y in x


perfplot.show(
    setup=setupTest,
    kernels=[inListMethod, inSetMethod],
    labels=["in list", "in set"],
    n_range=[2 ** k for k in range(2, 20)],
    xlabel="Data Length",
    title="duplicate values in list and to-be-checked value exists in the list",
    logx=True,
    logy=True,
)

La lista originale ha solo valori duplicati, e il valore selezionato non esiste nella lista

Python se il valore esiste nella lista - i valori duplicati nella lista e il valore da controllare non esiste nella lista

from itertools import chain
import perfplot
import numpy as np


def setupTest(n):
    a = np.arange(n)
    np.random.shuffle(a)
    randomlist = np.random.choice(n, n // 2).tolist()
    randomvalue = n + 1
    return [randomlist, randomvalue]


def inListMethod(L):
    x, y = L
    return y in x


def inSetMethod(L):
    x, y = L
    x = set(x)
    return y in x


perfplot.show(
    setup=setupTest,
    kernels=[inListMethod, inSetMethod],
    labels=["in list", "in set"],
    n_range=[2 ** k for k in range(2, 20)],
    xlabel="Data Length",
    title="duplicate values in list and to-be-checked value does not exist in the list",
    logx=True,
    logy=True,
)

Conclusione del confronto delle prestazioni

Sebbene il controllo di appartenenza in Python set sia più veloce di quello in Python list, la conversione da list o set richiede tempo. Quindi se i dati forniti sono quelli della lista Python, non hanno alcun beneficio in termini di prestazioni se prima si converte la lista in set e poi si effettua il controllo di appartenenza in set.

Python se il valore esiste nella lista - panoramica

from itertools import chain
import perfplot
import numpy as np


def setupTest(n):
    a = np.arange(n)
    np.random.shuffle(a)
    unique_randomlist = a[: n // 2].tolist()
    duplicate_randomlist = np.random.choice(n, n // 2).tolist()
    existing_randomvalue = unique_randomlist[len(unique_randomlist) // 2]
    nonexisting_randomvalue = n + 1
    return [
        unique_randomlist,
        duplicate_randomlist,
        existing_randomvalue,
        nonexisting_randomvalue,
    ]


def inListMethod_UniqueValue_ValueExisting(L):
    u, d, ex, ne = L
    return ex in u


def inListMethod_DuplicateValue_ValueExisting(L):
    u, d, ex, ne = L
    return ex in d


def inListMethod_UniqueValue_ValueNotExisting(L):
    u, d, ex, ne = L
    return ne in u


def inListMethod_DuplicateValue_ValueNotExisting(L):
    u, d, ex, ne = L
    return ne in d


def inSetMethod_UniqueValue_ValueExisting(L):
    u, d, ex, ne = L
    u = set(u)
    return ex in u


def inSetMethod_DuplicateValue_ValueExisting(L):
    u, d, ex, ne = L
    d = set(d)
    return ex in d


def inSetMethod_UniqueValue_ValueNotExisting(L):
    u, d, ex, ne = L
    u = set(u)
    return ne in u


def inSetMethod_DuplicateValue_ValueNotExisting(L):
    u, d, ex, ne = L
    d = set(d)
    return ne in d


perfplot.show(
    setup=setupTest,
    equality_check=None,
    kernels=[
        inListMethod_UniqueValue_ValueExisting,
        inListMethod_DuplicateValue_ValueExisting,
        inListMethod_UniqueValue_ValueNotExisting,
        inListMethod_DuplicateValue_ValueNotExisting,
        inSetMethod_UniqueValue_ValueExisting,
        inSetMethod_DuplicateValue_ValueExisting,
        inSetMethod_UniqueValue_ValueNotExisting,
        inSetMethod_DuplicateValue_ValueNotExisting,
    ],
    labels=[
        "inListMethod_UniqueValue_ValueExisting",
        "inListMethod_DuplicateValue_ValueExisting",
        "inListMethod_UniqueValue_ValueNotExisting",
        "inListMethod_DuplicateValue_ValueNotExisting",
        "inSetMethod_UniqueValue_ValueExisting",
        "inSetMethod_DuplicateValue_ValueExisting",
        "inSetMethod_UniqueValue_ValueNotExisting",
        "inSetMethod_DuplicateValue_ValueNotExisting",
    ],
    n_range=[2 ** k for k in range(2, 20)],
    xlabel="Data Length",
    logx=True,
    logy=True,
)
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - Python List