2015-06-14 53 views
5

我有一個數據列表如下:測試,如果幾何項目在Python列表相交

from shapely.geometry import box 

data = [box(1,2,3,4), box(5,6,7,8), box(1,2,3,4)] 
codes = ['A','B','C'] 

名單「數據」有以下元素

A = box(1,2,3,4) 
B = box(5,6,7,8) 
C = box(1,2,3,4) 

我要檢查是否一個元素與任何其他元素相交。如果相交,他們應該放入一個元組;如果不相交,他們應該放入不同的元組。預期的結果是:

result = [(A,C), (B)] 

怎麼辦?

我嘗試了爲:

results = [] 
for p,c in zip(data,codes): 
    for x in data: 
     if p.intersects(x): ##.intersects return true if they overlap else false 
      results.append(c) 
print results 
+0

是否是子列表和數據意味着相同? – maxymoo

+0

@maxymoo阿哈對不起!是的!我將在 – jean

+0

這個問題中糾正你的意思是'codes = [「A」,「B」,「C」]'? – maxymoo

回答

2

保留映射到A,B和C的對象的字典,一組匹配的對象,並且只有在我們遇到新的字母后添加沒有匹配的單個元素(如果它們不在我們的匹配集中)可能的組合將已經過測試:

from shapely.geometry import box 
from itertools import combinations 

codes = ["A", "B", "C"] 
d = dict(zip(codes, data)) 
prev = codes[0] 
matched, out = set(), [] 
for p1, p2 in combinations(codes, 2): 
    if d[p1].intersects(d[p2]): 
     out.append((p1, p2)) 
     matched.update([p1, p2]) 
    # when p1 is a new letter, we have tried all combs for that prev 
    # if prev is not in matched it did not intersect any other so 
    # add it as a single tuple and add to matched to avoid dupes 
    elif p1 != prev and prev not in matched: 
     out.append(tuple(prev,)) 
     matched.add(prev) 
    prev = p1 
# catch the last letter 
if p2 not in matched: 
    out.append(tuple(p2,)) 
print(out) 
[('A', 'C'), ('B',)] 
+0

感謝您的結果。 Hoever想如何簡化它.. – jean

+0

@ jose,如果你想得到正確的結果,並按正確的順序,它確實爲 –

+0

upvoted爲此,但很複雜... – jean

-1

對於數據每一個值,使具有交叉值的所有元素的元組。如果列表不在列表中,請將其添加到結果列表中。

results=[] 
for b in data 
    same_b = tuple([d for d in data if d.intersects(b)]) 
    if not same_b in results: 
     results.append(same_b) 

結果是元組列表,每個元組都有相同值的所有元素,即相交元素。

如果該元素已被提取到results中,則可以通過不創建元組來提高效率。

請注意,對於給定的數據集,與==的等同性可以代替相交。

如果您想要代碼而不是數據,請使用字典而非變量名稱。

+0

我真的不得不test.intersects在我真正的問題。請使用.intersects展示我。 – jean

+0

你的意思是你必須使用intersects方法嗎?在這個問題中,數據是完全一樣的,所以任何平等都可以工作。 – hilcharge

+0

是的,儘管數據 – jean

1
from shapely.geometry import box 

data = [box(1,2,3,4), box(5,6,7,8), box(1,2,3,4)] 
codes = ['A','B','C'] 

創建一個字典,你的代碼映射到您的箱子:

d = dict(zip(codes, data)) 

檢查所有組合:

intersecting = set() 

for i, a in enumerate(codes, 1): 
    for b in codes[i:]: 
     if d[a].intersection(d[b]): 
      intersecting |= {a, b} 

print(tuple(intersecting), tuple(set(codes)^intersecting)) 
# ('C', 'A') ('B',) 

元組將被無序,因爲使用了集合。

+0

行的結尾做這個,謝謝你的結果。 Hoever想如何簡化它.. – jean