给出一个列表,我如何选择满足某些标准的元素对? 我知道线性搜索算法可以达到这个目的:
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 :(得分:4)
如何使用combinations
和filter
?
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)]