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 A
atıfta (x, y)
ve B
ifade 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, dict
ilk önce sorted
-based yöntemini denemek, shahable değerleri nedeniyle başarısız olursa -based count
yö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,b
olarak: bunlar ints / float / string, keyfi nesneler mi veya ne? Yerleşik tiplerdeyse ve her ikisini dex,y
vea,b
sıralı olarak tutmak mümkünse , ikinci daldan kaçınabilirsiniz. Bir küme oluşturmanın, dört öğenin her birinin,x,y, a,b
tamamen önemsiz olabilecek veya olmayabilecek veya tamamen ne tür nesnelere bağlı olarak performans etkisi olabileceğine neden olacağını unutmayın.