python - أفضل طريقة للعثور على تقاطع مجموعات متعددة؟




3 Answers

من Python الإصدار 2.6 يمكنك استخدام وسائط متعددة ل set.intersection() ، مثل

u = set.intersection(s1, s2, s3)

إذا كانت المجموعات في قائمة ، فسيتم ترجمة ذلك إلى:

u = set.intersection(*setlist)

حيث *a_list هو توسيع قائمة

لدي قائمة بالمجموعات:

setlist = [s1,s2,s3...]

اريد s1 ∩ s2 ∩ s3 ...

يمكنني كتابة وظيفة للقيام بذلك عن طريق تنفيذ سلسلة من s1.intersection(s2) ، إلخ.

هل هناك طريقة موصى بها أو أفضل أو مدمجة؟




من الواضح أن set.intersection هو ما تريده هنا ، ولكن إذا احتجت في أي وقت إلى تعميم "خذ مجموع كل هذه" ، "أخذ منتج كل هذه" ، "خذ xor من كل هذه" ، ما الذي تبحث عنه reduce وظيفة:

from operator import and_
from functools import reduce
print(reduce(and_, [{1,2,3},{2,3,4},{3,4,5}])) # = {3}

أو

print(reduce((lambda x,y: x&y), [{1,2,3},{2,3,4},{3,4,5}])) # = {3}



هنا ، أقدم وظيفة عامة للتقاطع المتعدد في محاولة للاستفادة من أفضل الطرق المتاحة:

def multiple_set_intersection(*sets):
    """Return multiple set intersection."""
    try:
        return set.intersection(*sets)
    except TypeError: # this is Python < 2.6 or no arguments
        pass

    try: a_set= sets[0]
    except IndexError: # no arguments
        return set() # return empty set

    return reduce(a_set.intersection, sets[1:])

Guido قد يكره reduce ، ولكن أنا من النوع مغرم :)




Related

python set set-intersection