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

  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

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.png

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)

Articolo correlato - Python List

  • Controllare la lista è vuota in Python
  • Elenco dei numeri da 1 a N in Python