Каков наилучший способ найти ВСЕ возможные пересечения нескольких множеств? - PullRequest
0 голосов
/ 11 июня 2019

Допустим, у меня есть следующие 4 набора

Set1 = {1,2,3,4,5}
Set2 = {4,5,6,7}
Set3 = {6,7,8,9,10}
Set4 = {1,8,9,15}

Я хочу найти все возможные пересечения между любым из этих наборов, например:

Set1 and Set4: 1
Set1 and Set2: 4,5
Set2 and Set3: 6,7
Set3 and Set4: 8,9

Каков наилучший подход к этому с точки зрения Python? Спасибо!

Ответы [ 3 ]

1 голос
/ 11 июня 2019

С здесь :

# Python3 program for intersection() function 

set1 = {2, 4, 5, 6}  
set2 = {4, 6, 7, 8}  
set3 = {4,6,8} 

# union of two sets 
print("set1 intersection set2 : ", set1.intersection(set2)) 

# union of three sets 
print("set1 intersection set2 intersection set3 :", set1.intersection(set2,set3)) 

И с документов :

пересечение (* другие)

набор и другие & ...

Возвращает новый набор с элементами, общими для набора и всех остальных.

0 голосов
/ 12 июня 2019

Если вы ищете только пересечения двух наборов, вы можете просто сделать вложенные циклы:

Set1 = {1,2,3,4,5}
Set2 = {4,5,6,7}
Set3 = {6,7,8,9,10}
Set4 = {1,8,9,15}
sets = [Set1,Set2,Set3,Set4]
for i,s1 in enumerate(sets[:-1]):
    for j,s2 in enumerate(sets[i+1:]):
        print(f"Set{i+1} and Set{i+j+2} = {s1&s2}")

# Set1 and Set2 = {4, 5}
# Set1 and Set3 = set()
# Set1 and Set4 = {1}
# Set2 and Set3 = {6, 7}
# Set2 and Set4 = set()
# Set3 and Set4 = {8, 9}

Если вы ищете пересечения любого числа этих наборов, то вы можете использовать комбинации () из itertools, чтобы получить набор индексов мощности и выполнить пересечение для каждой комбинации:

from itertools import combinations
for comboSize in range(2,len(sets)):
    for combo in combinations(range(len(sets)),comboSize):
        intersection = sets[combo[0]]
        for i in combo[1:]: intersection = intersection & sets[i]
        print(" and ".join(f"Set{i+1}" for i in combo),"=",intersection)

Set1 and Set2 = {4, 5}
Set1 and Set3 = set()
Set1 and Set4 = {1}
Set2 and Set3 = {6, 7}
Set2 and Set4 = set()
Set3 and Set4 = {8, 9}
Set1 and Set2 = {4, 5}
Set1 and Set3 = set()
Set1 and Set4 = {1}
Set2 and Set3 = {6, 7}
Set2 and Set4 = set()
Set3 and Set4 = {8, 9}
Set1 and Set2 and Set3 = set()
Set1 and Set2 and Set4 = set()
Set1 and Set3 and Set4 = set()
Set2 and Set3 and Set4 = set()
0 голосов
/ 11 июня 2019

Вам нужно найти 2 комбинации комбинаций (вычтенные из желаемого результата). Это может быть достигнуто с помощью [Python 3.Docs]: itertools. комбинаций ( повторяем, r ) . Для каждой комбинации должно быть выполнено пересечение между двумя наборами.
Для выполнения вышеизложенного (входные) наборы «сгруппированы» в список (итеративный).

Также указывает [Python 3.docs]: класс набор ( [повторяемый] ) .

code.py

#!/usr/bin/env python3

import sys
import itertools


def main():
    set1 = {1, 2, 3, 4, 5}
    set2 = {4, 5, 6, 7}
    set3 = {6, 7, 8, 9, 10}
    set4 = {1, 8, 9, 15}

    sets = [set1, set2, set3, set4]

    for index_set_pair in itertools.combinations(enumerate(sets, start=1), 2):
        (index_first, set_first), (index_second, set_second) = index_set_pair
        intersection = set_first.intersection(set_second)
        if intersection:
            print("Set{:d} and Set{:d} = {:}".format(index_first, index_second, intersection))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
    print("\nDone.")

Обратите внимание, что [Python 3.Docs]: встроенные функции - перечисление ( повторяемость, начало = 0 ) используется только в целях печати ( Set 1 , Set 2 , ... на выходе).

выход

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q056551261]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

Set1 and Set2 = {4, 5}
Set1 and Set4 = {1}
Set2 and Set3 = {6, 7}
Set3 and Set4 = {8, 9}

Done.
...