Tampaknya OP hanya peduli dengan kasus dua variabel, tetapi karena StackOverflow juga untuk mereka yang mencari pertanyaan yang sama nanti, saya akan mencoba untuk menangani kasus generik di sini secara rinci; Satu jawaban sebelumnya sudah menggunakan jawaban umum itertools.permutations()
, tetapi metode itu mengarah ke O(N*N!)
perbandingan, karena masing-masing ada N!
permutasi dengan N
item. (Ini adalah motivasi utama untuk jawaban ini)
Pertama, mari kita simpulkan bagaimana beberapa metode dalam jawaban sebelumnya berlaku untuk kasus umum, sebagai motivasi untuk metode yang disajikan di sini. Saya akan menggunakan A
untuk merujuk (x, y)
dan B
merujuk (a, b)
, yang bisa berupa tupel dengan panjang yang sewenang-wenang (tapi sama).
set(A) == set(B)
cepat, tetapi hanya berfungsi jika nilainya hashable dan Anda dapat menjamin bahwa salah satu tupel tidak mengandung nilai duplikat apa pun. (Mis. {1, 1, 2} == {1, 2, 2}
, Seperti yang ditunjukkan oleh @ user2357112 di bawah jawaban @Daniel Mesejo)
Metode sebelumnya dapat diperluas untuk bekerja dengan nilai duplikat dengan menggunakan kamus dengan jumlah, alih-alih set: (Ini masih memiliki batasan bahwa semua nilai harus dapat hashable, jadi mis. Nilai yang dapat diubah seperti list
tidak akan berfungsi)
def counts(items):
d = {}
for item in items:
d[item] = d.get(item, 0) + 1
return d
counts(A) == counts(B)
sorted(A) == sorted(B)
tidak memerlukan nilai hashable, tetapi sedikit lebih lambat, dan sebaliknya membutuhkan nilai yang bisa dipesan. (Jadi mis. Tidak complex
akan bekerja)
A in itertools.permutations(B)
tidak memerlukan nilai hashable atau orderable, tetapi seperti yang telah disebutkan, ia memiliki O(N*N!)
kompleksitas, sehingga bahkan dengan hanya 11 item, dapat membutuhkan waktu lebih dari satu detik untuk menyelesaikannya.
Jadi, apakah ada cara untuk menjadi umum, tetapi apakah itu jauh lebih cepat? Mengapa ya, dengan "secara manual" memeriksa bahwa ada jumlah yang sama dari setiap item: (Kompleksitas yang satu ini O(N^2)
, jadi ini juga tidak baik untuk input besar; Pada mesin saya, 10k item dapat membutuhkan waktu satu detik - tetapi dengan input yang lebih kecil, seperti 10 item, ini sama cepatnya dengan yang lain)
def unordered_eq(A, B):
for a in A:
if A.count(a) != B.count(a):
return False
return True
Untuk mendapatkan kinerja terbaik, orang mungkin ingin mencoba dict
metode berbasis pertama, kembali ke sorted
metode berbasis jika itu gagal karena nilai-nilai yang tidak dapat dihancurkan, dan akhirnya jatuh kembali ke count
metode berbasis jika itu juga gagal karena nilai-nilai tidak teratur.
x,y, a,b
: apakah int / float / string, objek arbitrer, atau apa? Jika mereka adalah tipe builtin dan dimungkinkan untuk menjaga keduanyax,y
dana,b
dalam urutan, maka Anda dapat menghindari cabang kedua. Perhatikan bahwa membuat himpunan akan menyebabkan masing-masing dari empat elemenx,y, a,b
menjadi hash, yang mungkin atau mungkin tidak sepele atau memiliki implikasi kinerja tergantung sepenuhnya pada jenis objek apa mereka.