Verifica se la Lista contiene tutti gli elementi di un altra lista

Qual è il modo più semplice/veloce per controllare se una lista di tuple, che contiene tutte le tuple che un altro elenco. Per esempio:

t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
t2 = [ (3,4), (11,12) ]

sarebbe un vero caso dal t1 contiene tutte le tuple in t2. Ho provato qualcosa di simile:

[i for e in t2 for i in t1 if e in i]
sorted(t1) == sorted(t2)

ma questo sembrava sempre restituire true. C’è un modo migliore?

  • la ricerca e l’utilizzo di set di

 

3 Replies
  1. 19

    È possibile utilizzare sets

    t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
    t2 = [ (3,4), (11,12) ]
    set(t2).issubset(t1)
    # returns true
    
    # or equivalent use '<=' so
    set(t2) <= set(t1)
    # returns true
    • Che devono essere minuscole — sets.
  2. 6

    Per semplicità, si potrebbe fare così:

    print all(x in t1 for x in t2)

    Tuttavia, che la ricerca attraverso t1 per ogni elemento in t2. Che, probabilmente, non importa quando t1 è piccola, come in questo caso, ma di consentire per i più grandi collezioni vorrei fare questo:

    s1 = set(t1)
    print all(x in s1 for x in t2)

    o questo:

    print set(t1).issuperset(t2)

    Questo di solito è più veloce, dal momento che in è molto più veloce per i set di rispetto per gli elenchi di grandi dimensioni. Non c’è nessun grande vantaggio in termini di prestazioni nella conversione t2 di un insieme, indipendentemente dalle loro dimensioni, in modo che non sarebbe.

    Come sempre, è meglio se è possibile ottenere i dati nel “diritto” di raccolta per cominciare. Quindi, se lo scopo principale di t1 è quello di guardare le cose in esso, utilizzare un set in primo luogo piuttosto che in un elenco.

  3. 2

    È possibile creare sets da quegli elenchi e utilizzare issubset metodo:

    >>> t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
    >>> t2 = [ (3,4), (11,12) ]
    >>> s1 = set(t1)
    >>> s2 = set(t2)
    >>> s2.issubset(s1)
    True

Lascia un commento