2015-06-14 11 views
5

piton listesinde kesişen:testi aşağıdaki gibi bir veri listesi

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'] 

elemanları ait aşağıdaki listesi 'veri':

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

I olmadığını kontrol etmek zorunda Bir eleman diğer unsurlarla kesişir. Eğer kesişirse, bir tuple koymaları gerekir; ve eğer birbiriyle kesişmiyorlarsa, farklı bir tuple koymalılar. Beklenen sonuç:

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

Nasıl Yapılır? kesişen değerine sahip tüm elemanların bir demet yapmak, veri her bir değeri için

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

'un alt listeleri ve verileri aynı mıydı? – maxymoo

+0

@maxymoo Aha üzgünüm! Evet öyle! – jean

+0

sorusunu düzeltebilirim: code = ["A", "B", "C"] '? – maxymoo

cevap

2

A, B ve C eşlemli eşleştirmelerden oluşan bir nesne taslaklarını tutun ve yalnızca eşleşen öğelerimizde değilse, yeni bir harfe ulaştıktan sonra eşleşme olmayan tek öğeleri ekleyin. olası kombinasyon test edilmiş olacaktır:

d = dict(zip(codes, data)) 

Kontrol tüm kombinasyonları:

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

verilere teşekkür ederiz. Nasıl basitleştireceğini düşündüm. – jean

+0

Doğru sonuca ve doğru sıraya sahip olmak istiyorsanız, bunun için hem de –

+0

her ne kadar bu kadar tahminde bulunursanız, o kadar az karmaşık ... – jean

-1

:

I olarak çalıştı. Liste zaten listede değilse, sonuçları listesine ekleyin.

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) 

sonuç, aynı değere sahip tüm unsurları vardır kesişen elemanları, yani, her biri dizilerini listesidir.

Bunu eleman zaten results içerisinde özü olup olmadığını bir demet yapmayarak bu daha verimli hale getirebilir.

Belirtilen veri kümesi için, == ile eşitliğin kesişme yerine çalışacağını unutmayın.

Veri yerine kodlar isterseniz, değişken olmayan bir sözlük kullanın. codes={'A':box(...),..}

+0

Gerçekten benim gerçek sorunumda test.intersects var. Lütfen bana .intersects'i kullanarak göster. – jean

+0

Kesişim yöntemini kullanmanız mı gerekiyor? Soruda, veriler tamamen aynıdır, dolayısıyla herhangi bir eşitlik işe yarayacaktır. – hilcharge

+0

evet sonuç için teşekkürler – 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'] 

kutuların için kodunuzu eşleştirmek için bir sözlük oluşturSetler kullanıldıkları için, takımlar sırasız olacaklardır.

+0

hatlarından oluşan bir kuponda yapabiliriz. Nasıl basitleştireceğini düşündüm. – jean