2015-09-28 3 views
0

Я хотел бы получить объединение двух наборов frozensets. Меня интересует только объединение frozensets, которые не пересекаются. Другой способ взглянуть на это состоит в том, что меня интересуют только союзы, длина которых равна общей длине как frozensets в сочетании. В идеале я хотел бы игнорировать любые frozensets, которые не пересекаются друг с другом для массового ускорения. Я ожидаю, что многие frozensets будут иметь хотя бы один элемент. Вот код, который у меня есть на python. Я хотел бы, чтобы это было как можно быстрее, поскольку я работаю с большим набором данных. Каждый из frozensets составляет не более 20 элементов, но в наборе будет около 1 000 сум. Все числа будут от 0 до 100. Я открыт для преобразования в другие типы, если это позволит моей программе работать быстрее, но я не хочу, чтобы повторяющиеся элементы и порядок не были важны.Получите соединение всех наборов, которые не пересекаются более эффективно

sets1 = set([frozenset([1,2,3]),frozenset([4,5,6]),frozenset([8,10,11])]) 
sets2 = set([frozenset([8,9,10]),frozenset([6,7,3])]) 
newSets = set() 
for fset in sets1: 
    for fset2 in sets2: 
     newSet = fset.union(fset2) 
     if len(newSet) == len(fset)+len(fset2): 
      newSets.add(frozenset(newSet)) 

правильный выход

set(frozenset([1,2,3,8,9,10]),frozenset([4,5,6,8,9,10]),frozenset([8,10,11,6,7,3])) 
+1

'{s1 | s2 для s1 в наборах1 для s2 в наборах2, если s1.isdisjoint (s2)} ' –

ответ

1
sets1 = set([frozenset([1,2,3]),frozenset([4,5,6]),frozenset([8,10,11])]) 
sets2 = set([frozenset([8,9,10]),frozenset([6,7,3])]) 




union_ = set() 

for s1 in sets1: 
    for s2 in sets2: 
     if s1.isdisjoint(s2): 
      union_.add(s1 | s2) 


print(union_) 



{frozenset({3, 6, 7, 8, 10, 11}), frozenset({1, 2, 3, 8, 9, 10}), frozenset({4, 5, 6, 8, 9, 10})} 
+1

' s1 & s2' приведет к созданию ненужного набора, вместо этого мы можем 's1.isdisjoint (s2)'. –

+0

@AshwiniChaudhary хороший пункт! изменит строку if ... – LetzerWille

Смежные вопросы