Hoe te controleren of een waarde snel voorkomt in de Python-lijst

  1. in Methode om het bestaan ​​van de waarde in de Python-lijst te controleren
  2. Converteer lijst naar set en voer vervolgens de lidmaatschapscontrole uit in Python
  3. Prestatievergelijking tussen lijst en ingestelde lidmaatschapscontrole

We zullen verschillende methoden introduceren om te controleren of er een waarde bestaat in de Python-lijst en hun prestaties vergelijken.

Een Stucloper om snel en makkelijk ...
Een Stucloper om snel en makkelijk de vloer te beschermen tegen verfspetters/druppels

De methoden omvatten,

  1. in Methode voor lidmaatschapscontrole - Methode om te controleren of de waarde bestaat
  2. Converteer lijst naar set en gebruik vervolgens de methode voor lidmaatschapscontrole in

in Methode om het bestaan ​​van de waarde in de Python-lijst te controleren

in is de juiste manier om de lidmaatschapscontrole uit te voeren in de Python-lijst, set, woordenboek of andere iterabele Python-objecten.

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

Converteer lijst naar set en voer vervolgens de lidmaatschapscontrole uit in Python

De check-inlijst voor lidmaatschap kan inefficiënt zijn als de lijst groter wordt, vooral als er dubbele elementen in de lijst voorkomen.

Python-set is een beter gegevenstype in dit scenario om de lidmaatschapscontrole uit te voeren, omdat deze alleen unieke waarden bevat.

Prestatievergelijking tussen lijst en ingestelde lidmaatschapscontrole

We zullen de prestatieverschillen in vier situaties vergelijken,

  1. De originele lijst heeft unieke waarden en de aangevinkte waarde bestaat in de lijst
  2. De originele lijst heeft unieke waarden en de aangevinkte waarde bestaat niet in de lijst
  3. De originele lijst heeft dubbele waarden en de aangevinkte waarde bestaat in de lijst
  4. De originele lijst heeft alleen dubbele waarden en de aangevinkte waarde bestaat niet in de lijst

De originele lijst heeft alleen unieke waarden en de aangevinkte waarde bestaat in de lijst

Python of waarde bestaat in lijst - unieke waarden in lijst en te controleren waarde bestaat in de list.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)

De originele lijst heeft alleen unieke waarden en de aangevinkte waarde bestaat niet in de lijst

Python of waarde bestaat in lijst - unieke waarden in lijst en te controleren waarde bestaat niet in de lijst

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)

De originele lijst heeft dubbele waarden en de aangevinkte waarde bestaat in de lijst

Python of waarde bestaat in lijst - dubbele waarden in lijst en te controleren waarde bestaat in de lijst

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)

De originele lijst heeft alleen dubbele waarden en de aangevinkte waarde bestaat niet in de lijst

Python of waarde bestaat in lijst - dubbele waarden in lijst en te controleren waarde bestaat niet in de lijst

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)

Conclusie van prestatievergelijking

Hoewel lidmaatschapscontrole in Python set sneller is dan die in Python-lijst, kost de conversie van lijst of set tijd. Dus als de gegeven gegevens Python-lijst zijn, heeft het geen prestatievoordelen als u de lijst eerst converteert naar set en vervolgens het lidmaatschap incheckt set.

Python of waarde bestaat in lijst - overzicht

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)

Gerelateerde Artikelen - Python List

  • Wat is het verschil tussen lijstmethoden toevoegen en uitbreiden
  • Een lijst converteren naar tekenreeks in Python
  • Hoe twee of meerdere lijsten in Python samen te voegen
  • Wat is het verschil tussen del, verwijder en pop op Python-lijsten