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


1 Answers

اعتبارًا من 2.6 ، تأخذ set.intersection بشكل تعسفي العديد من set.intersection .

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s3 = set([2, 4, 6])
>>> s1 & s2 & s3
set([2])
>>> s1.intersection(s2, s3)
set([2])
>>> sets = [s1, s2, s3]
>>> set.intersection(*sets)
set([2])
Question

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

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

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

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

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




إذا لم يكن لديك Python 2.6 أو أعلى ، فسيكون البديل كتابة حلقة صريحة للحلقة:

def set_list_intersection(set_list):
  if not set_list:
    return set()
  result = set_list[0]
  for s in set_list[1:]:
    result &= s
  return result

set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])

يمكنك أيضًا استخدام reduce :

set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])

ومع ذلك ، فإن العديد من المبرمجين في بيثون لا يحبونها ، بما في ذلك غيدو نفسه :

منذ حوالي 12 عامًا ، كانت بيثون تتزود بامدا ، وتخفّض () ، وفلتر () وخريطة () ، من باب المجاملة (على ما أظن) أحد المتسلّلين من ليسب الذين غاب عنهم وقدموا بقع عمل. ولكن ، على الرغم من قيمة العلاقات العامة ، أعتقد أنه يجب قطع هذه الميزات من Python 3000.

حتى الآن تقلل (). هذا في الواقع هو ما أكرهه دائماً ، لأنه بخلاف بعض الأمثلة التي تتضمن + أو * ، في كل مرة أرى فيها مكالمة () أقل تقريبًا مع حجة دالة غير عادية ، أحتاج إلى إمساك القلم والورقة الرسم البياني ما يتم إدخاله بالفعل في هذه الوظيفة قبل أن أفهم ما الذي يفترض أن تقوم به. لذا في رأيي ، فإن قابلية التقليل () تقصر إلى حد كبير على المشغلين التابعين ، وفي جميع الحالات الأخرى من الأفضل كتابة حلقة التراكم بشكل واضح.




Related