OP sadece iki değişkenle ilgiliydi, ancak StackOverflow da aynı soruyu daha sonra arayanlar için olduğundan, genel durumu burada ayrıntılı olarak ele almaya çalışacağım; Önceki bir cevap zaten kullanarak genel bir cevap içerir itertools.permutations(), ancak her biri öğelerle permütasyonlar olduğu için bu yöntem O(N*N!)karşılaştırmaya yol açar . (Bu cevap için ana motivasyon buydu)N!N
İlk olarak, önceki yanıtlardaki yöntemlerden bazılarının burada sunulan yöntem için motivasyon olarak genel durum için nasıl geçerli olduğunu özetleyelim. I kullanarak olacak Aatıfta (x, y)ve Bifade etmek için (a, b)keyfi (fakat eşit) uzunluğunda küpe olabilir,.
set(A) == set(B)hızlıdır, ancak yalnızca değerlerin yıkanabilir olması durumunda çalışır ve gruplardan birinin yinelenen değerler içermediğini garanti edebilirsiniz. (Örn. {1, 1, 2} == {1, 2, 2}, @Daniel Mesejo'nun cevabı altında @ user2357112 tarafından belirtildiği gibi)
Önceki yöntem, kümeler yerine sayıları olan sözlükler kullanarak yinelenen değerlerle çalışmak üzere genişletilebilir: (Bu yine de tüm değerlerin yıkanabilir olması gibi bir sınırlamaya sahiptir, örn. Gibi değiştirilebilir değerler listçalışmaz)
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)yıkanabilir değerler gerektirmez, ancak biraz daha yavaştır ve bunun yerine düzenlenebilir değerler gerektirir. (Yani, örneğin complexçalışmaz)
A in itertools.permutations(B)yıkanabilir veya düzenlenebilir değerler gerektirmez, ancak daha önce de belirtildiği gibi, O(N*N!)karmaşıklığı vardır, bu nedenle sadece 11 öğeyle bile bitirmek bir saniyeyi alabilir.
Peki, genel olmanın bir yolu var, ama çok daha hızlı mı? Neden evet, "el ile" her öğenin aynı miktarda olup olmadığını kontrol ederek: (Bunun karmaşıklığı, bu O(N^2)büyük girişler için de iyi değil; Makinemde 10k öğe bir saniyeyi devralabilir - ancak 10 öğe gibi daha küçük girdiler, bu diğerleri kadar hızlıdır)
def unordered_eq(A, B):
for a in A:
if A.count(a) != B.count(a):
return False
return True
En iyi performansı elde etmek için, dictilk önce sorted-based yöntemini denemek, shahable değerleri nedeniyle başarısız olursa -based countyöntemine geri dönmek ve nihayetinde dayanılmaz değerler nedeniyle başarısız olursa -based yöntemine geri dönmek isteyebilirsiniz.
x,y, a,bolarak: bunlar ints / float / string, keyfi nesneler mi veya ne? Yerleşik tiplerdeyse ve her ikisini dex,yvea,bsıralı olarak tutmak mümkünse , ikinci daldan kaçınabilirsiniz. Bir küme oluşturmanın, dört öğenin her birinin,x,y, a,btamamen önemsiz olabilecek veya olmayabilecek veya tamamen ne tür nesnelere bağlı olarak performans etkisi olabileceğine neden olacağını unutmayın.