Birçok kullanım durumunda, istediğiniz cevap:
ys = set(y)
[item for item in x if item not in ys]
Bu, aaronasterling'in yanıtı ve quantumSoup'un yanıtı arasında bir melez .
aaronasterling'in sürümü, len(y)
içindeki her öğe için öğe karşılaştırmaları yapar x
, bu nedenle ikinci dereceden zaman alır. quantumSoup versiyonu kullanır setleri, böylece her bir eleman için tek bir sabit zamanlı seti arama yapar x
o dönüştürür çünkü -ama her ikisi x
ve y
kümeler halinde, bu öğelerin sırasını kaybeder.
Sadece y
bir sete dönüştürerek ve x
sırayla yineleyerek , her iki dünyanın en iyisini elde edersiniz - doğrusal zaman ve sipariş koruması. *
Ancak, bunun hala quantumSoup'un sürümünden bir sorunu var: Öğelerinizin yıkanabilir olmasını gerektirir. Bu, kümelerin doğası üzerine inşa edilmiştir. ** Örneğin, başka bir dikte listesinden bir dikte listesi çıkarmaya çalışıyorsanız, ancak çıkarılacak liste büyükse, ne yapıyorsunuz?
Değerlerinizi yıkanabilir olacak şekilde dekore edebiliyorsanız, bu sorunu çözer. Örneğin, değerleri kendiliğinden yıkanabilir düz bir sözlükle:
ys = {tuple(item.items()) for item in y}
[item for item in x if tuple(item.items()) not in ys]
Türleriniz biraz daha karmaşıksa (örneğin, genellikle yıkanabilir olan JSON uyumlu değerlerle veya değerleri özyinelemeli olarak aynı tür olan listeleri veya diktelerle uğraşıyorsanız), bu çözümü kullanmaya devam edebilirsiniz. Ancak bazı türler yıkanabilir bir şeye dönüştürülemez.
Öğeleriniz değilse ve yapılamazsa, yıkanabilir, ancak karşılaştırılabilir durumdaysa, en azından log-lineer zaman alabilirsiniz ( O(N*log M)
bu, O(N*M)
liste çözümünün zamanından çok daha iyi , ancak o kadar iyi değil) O(N+M)
ayırma ve kullanarak ayarlanan çözelti süresi) bisect
:
ys = sorted(y)
def bisect_contains(seq, item):
index = bisect.bisect(seq, item)
return index < len(seq) and seq[index] == item
[item for item in x if bisect_contains(ys, item)]
Eşyalarınız ne yıkanabilir ne de karşılaştırılabilir ise, ikinci dereceden çözümle sıkışıp kalırsınız.
* Bunu OrderedSet
, tarifleri ve üçüncü taraf modülleri bulabileceğiniz bir çift nesne kullanarak da yapabileceğinizi unutmayın . Ama bence bu daha basit.
** Set aramalarının sabit zaman olmasının nedeni, tek yapması gereken değerin hash olmasıdır ve bu karma için bir giriş olup olmadığına bakmaktır. Değeri hash edemezse, bu işe yaramaz.