2015-08-25 87 views
1

給出一個列表,我如何選擇滿足某些標準的元素對? 我知道一個線性搜索算法可以實現這一點:如何選擇滿足Python中某些標準的列表的元素對?

b = [] 
for i in range(len(a)-1): 
    for j in range(i+1,len(a)): 
     if isTrue(a[i],a[j]): 
      b.append([a[i],a[j]]) 

任何更好的解決方案可以做到這一點更高效?

更新

@ scytale的的評論激起了我的解決方案。但它不可能是完美的。

例如,a = [1.2,3.1,0.3,4.2,5.6,2.7,1.1]。我想對元素的總和,其中小於3

b = [(x,y) for x in a for y in a if (x+y)<3 and x!=y] 

這會給重複對:

[(1.2,0.3),(1.2,1.1),(0.3,1.2),(0.3,1.1),(1.1,1.2),(1.1,0.3)] 

但我想要的是:

[(1.2,0.3),(1.2,1.1),(0.3,1.1)] 
+0

[在列表綜合雙迭代]的可能重複(http://stackoverflow.com/questions/2522503/advanced-python-list-comprehension) – scytale

+0

隨着我更新,我不能得到不重複的結果... – xibinke

+1

請使用搜索:http://stackoverflow.com/questions/7961363/python-removing-duplicates-in-lists – scytale

回答

4

如何使用combinationsfilter

from itertools import combinations 

c = combinations(a, 2) 
f = filter(lambda x, y: isTrue(x, y), c) 

或者使用列表理解:

result = [(x, y) for x, y in c if isTrue(x, y)] 
+0

最後一個腳本是偉大的。至於過濾器,當使用「f =過濾器(lambda x,y:x + y <3,c)」時,爲什麼會引發「lambda需要兩個參數......」的錯誤? – xibinke

相關問題