Determinar si 2 listas tienen los mismos elementos, independientemente del orden?
inferir de tu ejemplo:
x = ['a', 'b']
y = ['b', 'a']
que no se repetirán los elementos de las listas (que son únicos), así como hashable (que cuerdas y otros ciertos objetos inmutables son pitón) , la respuesta más directa y computacionalmente eficiente usa conjuntos integrados de Python, (que son semánticamente semejantes a conjuntos matemáticos de los que puedes haber aprendido en la escuela).
set(x) == set(y) # prefer this if elements are hashable
En el caso de que los elementos son hashable, pero no único, la collections.Counter
también trabaja semánticamente como un conjunto múltiple, pero que es mucho más lento:
from collections import Counter
Counter(x) == Counter(y)
prefieren utilizar sorted
:
sorted(x) == sorted(y)
si los elementos pueden ordenarse. Esto explicaría las circunstancias no únicas o no manejables, pero esto podría ser mucho más lento que usar conjuntos.
experimento empírico
un experimento empírico concluye que se debe preferir set
, entonces sorted
. Solo opte por Counter
si necesita otras cosas como conteos o uso posterior como multiset.
Primera configuración:
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)
y pruebas:
>>> min(timeit.repeat(sets_equal))
13.976069927215576
>>> min(timeit.repeat(counters_equal))
73.17287588119507
>>> min(timeit.repeat(sorted_lists_equal))
36.177085876464844
Y vemos que la comparación de conjuntos es la solución más rápida, y la comparación de listas ordenadas es el segundo más rápido.
No debería ser una sorpresa ya que su método es O (N^2), que es mucho más grande que O (N) u O (N * log N). Para cada elemento de B (N elementos) está comprobando todos los elementos de A (N elementos). El número de cheques es entonces N * N. – RobMcZag