2012-07-05 19 views
22

Bir ifadeyi otomatik olarak etkileyen bir kod parçası yazmaya çalışıyorum. Örneğin, iki liste [1,2,3,4] ve [2,3,5] varsa kodunun iki listedeki ortak öğeleri bulabilmesi gerekir, [2,3] ve birleştir elemanların geri kalanı yeni bir listede, [1,4,5] olarak. Bu yayına itibaren Listelerdeki yaygın olmayan öğeleri bulun

: Ben ortak öğeler

set([1,2,3,4]&set([2,3,5]). 

bulunabilir görüyoruz How to find list intersection? her listeden olmayan ortak öğeleri almak için kolay bir yol olmak benim örnekte, var mı [1,4 ] ve [5]?

devam edip döngü için yapabilirsiniz:

lists = [[1,2,3,4],[2,3,5]] 
conCommon = [] 
common = [2,3] 
for elem in lists: 
    for elem in eachList: 
    if elem not in common: 
     nonCommon += elem 

Ama bu gereksiz ve verimsiz görünmektedir. Python bunu yapabilecek kullanışlı bir işlev sağlıyor mu? Şimdiden teşekkürler!!

+0

sizin gibi ayrı listeleri almak istiyorum [1,4] ve [5] veya tek tek [1,4,5]? – nye17

cevap

40

(XOR operatörü aka) set s için simetrik fark operatörünü kullanın:

>>> set([1,2,3])^set([3,4,5]) 
set([1, 2, 4, 5]) 
+0

oh vay teşekkürler! Bue, yukarıdaki kod, hesaplama ([1,2,3]) & set ([3,4,5]) olarak eşit miktarda hesaplama süresi ve bellek alanı alıyor mu? Ya da kod performansı üzerinde önemli bir etkisi yoktur? – turtlesoup

+0

Amacınızı gerçekleştirmenin en etkili yolu budur. Onun karmaşıklığı, '&' ile aynı düzende (yani, kümelerdeki elemanların sayısında doğrusal). – Amber

12

Sen sorunların bu tür başa Kavşak yöntemi kullanabilirsiniz.

b1 = [1,2,3,4,5,9,11,15] 
b2 = [4,5,6,7,8] 
set(b1).intersection(b2) 
Out[22]: {4, 5} 

Bu kodu kullanmayla ilgili en iyi şey, büyük veriler için oldukça hızlı çalışır. Bu mantığı kullandığımda, 607139 ve b2 ile 296029 elemanları arasında b1 var, sonuçları 2,9 saniyede elde ediyorum.

0

.__xor__ öznitelik yöntemini kullanabilirsiniz.

set([1,2,3,4]).__xor__(set([2,3,5])) 

veya

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b) 
İlgili konular