الفرق بين المراجعتين ل"Python/itertools/combinations with replacement"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(إضافة الصّفحة)
 
سطر 3: سطر 3:
 
تُنتَج التّجميعات حسب الترتيب المُعجميّ (lexicographic). ما يعني بأنّ الصّفوف النّاتجة ستكون مُرتّبةً إن كان الكائن القابل للتّكرار المُعطى مُرتّبًا.
 
تُنتَج التّجميعات حسب الترتيب المُعجميّ (lexicographic). ما يعني بأنّ الصّفوف النّاتجة ستكون مُرتّبةً إن كان الكائن القابل للتّكرار المُعطى مُرتّبًا.
  
تُعامَل العناصر على أنّها فريدة حسب موقعها، وليس حسب قيمها. لذا إن كانت عناصر الكائن القابل للتّكرار المُدخَل فريدةً فلن تُكرّر أيّة قيم في كلّ  تجميعة.
+
تُعامَل العناصر على أنّها فريدة حسب موقعها، وليس حسب قيمها. لذا إن كانت عناصر الكائن القابل للتّكرار المُدخَل فريدةً فستكون التّجميعات المُنتجةُ فريدةً كذلك.
  
 
== البنية العامة ==
 
== البنية العامة ==
سطر 21: سطر 21:
  
 
== أمثلة ==
 
== أمثلة ==
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة، إضافة إلى مُقارنتها مع الدّالة <code>itertools.combinations‎()‎</code>:
+
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة، إضافة إلى مُقارنتها مع الدّالة <code>[[Python/itertools/combinations|itertools.combinations‎()]]‎</code>:
 
<syntaxhighlight lang="python3">
 
<syntaxhighlight lang="python3">
 
>>> c = itertools.combinations_with_replacement('ABCD', 2)
 
>>> c = itertools.combinations_with_replacement('ABCD', 2)
سطر 53: سطر 53:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
يُمكن كذلك تمثيل شيفرة الدّالة <code>itertools.combinations()‎</code> كتسلسل فرعيّ للدّالة <code>itertools.product()‎</code> بعد ترشيح المُدخلات التي لا تكون فيها العناصر مُرتّبة (حسب موقعها في مسبح المُدخلات):
+
يُمكن كذلك تمثيل شيفرة الدّالة <code>itertools.combinations()‎</code> كتسلسل فرعيّ للدّالة <code>[[Python/itertools/product|itertools.product()‎]]</code> بعد ترشيح المُدخلات التي لا تكون فيها العناصر مُرتّبة (حسب موقعها في مسبح المُدخلات):
 
<syntaxhighlight lang="python3">
 
<syntaxhighlight lang="python3">
 
def combinations_with_replacement(iterable, r):
 
def combinations_with_replacement(iterable, r):
سطر 66: سطر 66:
 
== انظر أيضًا ==
 
== انظر أيضًا ==
 
* [[Python/iterators|المكرِّرات Iterators في بايثون]].
 
* [[Python/iterators|المكرِّرات Iterators في بايثون]].
* [[Python/itertools/product|itertools.product]].
+
* [[Python/itertools/product|<code>itertools.product</code>]].
* [[Python/itertools/combinations|itertools.combinations]].
+
* [[Python/itertools/combinations|<code>itertools.combinations</code>]].
 
* [[Python/generators|المولدات Generators في بايثون]].
 
* [[Python/generators|المولدات Generators في بايثون]].
  

مراجعة 19:23، 8 يونيو 2018

تعيد الدّالة itertools.combinations_with_replacement()‎ تسلسلات فرعيّة (subsequences) تُعدّ تجميعات ذات طول مُحدّد لعناصر الكائن القابل للتّكرار المُعطى مع السّماح للعناصر بأن تُكرَّر لأكثر من مرّة. تُنتَج التّجميعات حسب الترتيب المُعجميّ (lexicographic). ما يعني بأنّ الصّفوف النّاتجة ستكون مُرتّبةً إن كان الكائن القابل للتّكرار المُعطى مُرتّبًا.

تُعامَل العناصر على أنّها فريدة حسب موقعها، وليس حسب قيمها. لذا إن كانت عناصر الكائن القابل للتّكرار المُدخَل فريدةً فستكون التّجميعات المُنتجةُ فريدةً كذلك.

البنية العامة

itertools.combinations_with_replacement(iterable, r)

المعاملات

iterable

الكائن القابل للتّكرار.

r

طول الصّفوف النّاتجة.

القيمة المعادة

صفوف بالطول المُعطى للمُعامل r تحتوي على تجميعات للعناصر المتواجدة في الكائن القابل للتّكرار المُعطى.

أمثلة

المثال التّالي يوضّح كيفيّة عمل هذه الدّالة، إضافة إلى مُقارنتها مع الدّالة itertools.combinations‎():

>>> c = itertools.combinations_with_replacement('ABCD', 2)
>>> list(c)
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'C'), ('C', 'D'), ('D', 'D')]

>>> c = itertools.combinations('ABCD', 2)
>>> list(c)
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

ملاحظات

الدّالة مُكافئة لما يلي:

def combinations_with_replacement(iterable, r):
    # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
    pool = tuple(iterable)
    n = len(pool)
    if not n and r:
        return
    indices = [0] * r
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != n - 1:
                break
        else:
            return
        indices[i:] = [indices[i] + 1] * (r - i)
        yield tuple(pool[i] for i in indices)

يُمكن كذلك تمثيل شيفرة الدّالة itertools.combinations()‎ كتسلسل فرعيّ للدّالة itertools.product()‎ بعد ترشيح المُدخلات التي لا تكون فيها العناصر مُرتّبة (حسب موقعها في مسبح المُدخلات):

def combinations_with_replacement(iterable, r):
    pool = tuple(iterable)
    n = len(pool)
    for indices in product(range(n), repeat=r):
        if sorted(indices) == list(indices):
            yield tuple(pool[i] for i in indices)

عدد العناصر المُعادة هو ‎(n+r-1)! / r! / (n-1)!‎ عند n > 0.

انظر أيضًا

مصادر