Determinare se 2 liste hanno gli stessi elementi, a prescindere dalla fine?
Dedurre dal vostro esempio:
x = ['a', 'b']
y = ['b', 'a']
che gli elementi delle liste non saranno ripetuti (sono unici), così come hashable (che stringhe e altri determinati oggetti Python immutabili sono) , la risposta più diretta ed efficiente dal punto di vista computazionale utilizza i set predefiniti di Python, (che sono semanticamente come set matematici di cui potresti aver imparato a scuola).
set(x) == set(y) # prefer this if elements are hashable
Nel caso in cui gli elementi sono hashable, ma non univoco, il collections.Counter
funziona anche semanticamente come multinsieme, ma che è molto più lento:
from collections import Counter
Counter(x) == Counter(y)
preferisce utilizzare sorted
:
sorted(x) == sorted(y)
se gli elementi sono ordinabili. Ciò spiegherebbe le circostanze non univoche o non-lavabili, ma potrebbe essere molto più lento rispetto all'uso dei set.
Esperimento empirica
Un esperimento empirico conclude che si dovrebbe preferire set
, quindi sorted
. Optate solo per Counter
se avete bisogno di altre cose come conteggi o ulteriore utilizzo come multiset.
Prima impostazione:
import timeit
import random
from collections import Counter
data = [str(random.randint(0, 100000)) for i in xrange(100)]
data2 = data[:] # copy the list into a new one
def sets_equal():
return set(data) == set(data2)
def counters_equal():
return Counter(data) == Counter(data2)
def sorted_lists_equal():
return sorted(data) == sorted(data2)
e test:
>>> min(timeit.repeat(sets_equal))
13.976069927215576
>>> min(timeit.repeat(counters_equal))
73.17287588119507
>>> min(timeit.repeat(sorted_lists_equal))
36.177085876464844
Così vediamo che il confronto insiemi è la soluzione più veloce, e confrontando gli elenchi ordinati è il secondo più veloce.
Non dovrebbe essere una sorpresa visto che il tuo metodo è O (N^2), che è molto più grande di O (N) o O (N * log N). Per ogni elemento di B (N elementi) controlla tutti gli elementi di A (N elementi). Il numero di controlli è quindi N * N. – RobMcZag