• 0

كيفية تطبيق الضرب الديكارتي في قوائم بايثون؟

كيف أقوم بضرب مجموعة من القاوائم للحصول على كل الإحتمالات الممكنة الناتجة عن ضرب هذه القوائم، على سبيل المثال لدي القائمة التالية:

sections = [ [1, 2, 3], [4, 5], [6, 7] ]

كيف أحصل على مجموعة من القائم كالتالي:

[

[1, 4, 6],
[1, 4, 7],
[1, 5, 6],
[1, 5, 7],
  
[2, 4, 6],
[2, 4, 7],
[2, 5, 6],
[2, 5, 7],
  
[3, 4, 6],
[3, 4, 7],
[3, 5, 6],
[3, 5, 7]

]

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يمكنك إستدعاء هذه الحزمة itertools.product و هي متاحة في بايثون من إصدار 2.6


import itertools

sections = [ [1, 2, 3], [4, 5], [6, 7] ]

for element in itertools.product(*sections):
    print(element)

وهذا الكود مشابه للكود السابق

for element in itertools.product([1, 2, 3], [4, 5], [6, 7]):
    print(element)

 

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

أول طريقة من خلال استخدام النهج التكراري (الحلقات التكرارية):

# باستخدام الحلقات التكرارية
def cartesian_iterative(list):
  result = [[]]
  for l in list:
    result = [x+[y] for x in result for y in l]
  return result
# الآن يمكننا استخدام التابع السابق لتنفيذ الجداء الديكارتي على القوائم
sections = [ [1, 2, 3], [4, 5], [6, 7] ]
cartesian_iterative(sections)

من خلال استخدام lambda و reduce:

# تعريف التابع
def prod(pools):
  import functools
  from itertools import product
  return list(functools.reduce(lambda x,y: product(x,y) , pools))
# استخدامه
prod(sections)  

أو من خلال العودية:

# تعريف التابع
def product(ar_list):
    if not ar_list:
        yield ()
    else:
        for a in ar_list[0]:
            for prod in product(ar_list[1:]):
                yield (a,)+prod
# لاستخدامه
list(product(sections))  

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن