Il modo migliore per farlo è ordinare gli elenchi e confrontarli. (L'uso Counter
non funzionerà con oggetti non hash.) Questo è semplice per gli interi:
sorted(a) == sorted(b)
Diventa un po 'più complicato con oggetti arbitrari. Se ti interessa l'identità dell'oggetto, ovvero se gli stessi oggetti sono presenti in entrambi gli elenchi, puoi utilizzare la id()
funzione come chiave di ordinamento.
sorted(a, key=id) == sorted(b, key==id)
(In Python 2.x non è effettivamente necessario key=
parametro, perché puoi confrontare qualsiasi oggetto con qualsiasi oggetto. L'ordinamento è arbitrario ma stabile, quindi funziona bene per questo scopo; non importa quale ordine siano gli oggetti in, solo che l'ordinamento è lo stesso per entrambi gli elenchi. In Python 3, tuttavia, il confronto di oggetti di tipi diversi è vietato in molte circostanze - ad esempio, non è possibile confrontare stringhe con numeri interi - quindi se si avranno oggetti di vari tipi, meglio usare esplicitamente l'ID dell'oggetto.)
Se si desidera confrontare gli oggetti nell'elenco per valore, d'altra parte, è necessario innanzitutto definire cosa significa "valore" per gli oggetti. Quindi avrai bisogno di un modo per fornirlo come chiave (e per Python 3, come tipo coerente). Un modo potenziale che funzionerebbe per molti oggetti arbitrari è quello di ordinare in base al loro repr()
. Ovviamente, ciò potrebbe far perdere molto tempo in più e repr()
stringhe di costruzione della memoria per elenchi di grandi dimensioni e così via.
sorted(a, key=repr) == sorted(b, key==repr)
Se gli oggetti sono tutti i tuoi tipi, puoi definirli __lt__()
in modo che l'oggetto sappia come confrontarsi con gli altri. Quindi puoi semplicemente ordinarli e non preoccuparti del key=
parametro. Ovviamente potresti anche definire __hash__()
e usareCounter
, che sarà più veloce.