يتكرر من خلال قائمة عدة مرات

أود التكرار من خلال قائمة عدة مرات. فمثلا:

mylist = [10,2,58]

for i in iterate_multiple_times(mylist, 3):
    print(i)

يجب أن تطبع:

10
2
58
10
2
58
10
2
58

القائمة طويلة جدًا ولا أريد إنشاء حلقات متداخلة متداخلة لأغراض لأغراض المسافة البادئة/النمط.

هل هناك حل أفضل (على سبيل المثال من وجهة نظر التخزين الإضافي) من ما يلي؟

from itertools import chain, repeat

for i in chain.from_iterable(repeat(mylist, 3)):
    print(i)
0
وأضاف المؤلف Richard Inglis, مصدر
@ Aran-Fey Oops، brain-fart. يعني mylist [i٪ 3] و بينما i <3 * len (mylist) .
وأضاف المؤلف Ev. Kounis, مصدر
ماذا عن بينما أنا في النطاق (len (mylist) * 3) و obj = mylist (i٪ 3) ؟
وأضاف المؤلف Ev. Kounis, مصدر
لماذا لا تتداخل لـ حلقات؟
وأضاف المؤلف Ev. Kounis, مصدر
@ Ev.Kounis لديك مجموعة من الأخطاء هناك ... mylist (i٪ 3) ؟ بينما أكون في نطاق (...) ؟
وأضاف المؤلف Aran-Fey, مصدر
كلاً من repeat و chain.from_iterable هما كسلان ، فأنت لا تنشئ نسخًا من القائمة بأكملها
وأضاف المؤلف Caleth, مصدر

3 إجابة

بخلاف استخدام itertools primitives ، يمكنك مضاعفة القائمة:

for i in mylist * 3: print(i)

أو قم بإنشاء الإجراء الخاص بك:

def mul(iterable, amount):
   while amount > 0:
      for x in iterable: yield x
      amount -= 1

ليس كثيرا في libs القياسية/builtins أخشى.

0
وأضاف
لا تعمل شفرتك مع التكرارات ذات التشغيل الفردي إما ... لا يمكنك استخدام ذلك كوسيطة.
وأضاف المؤلف Aran-Fey, مصدر
أليست هذه الطريقة المثالية؟ والمولد الساذج (وكذلك أي حل آخر ساذج للتكرار) سوف ينكسر بمجرد أن نستبدل أي محرك آخر قابل للتشغيل مرة واحدة ،
وأضاف المؤلف bipll, مصدر
نعم ، هذا هو السبب في أنني أطلق عليها اسم السذاجة .
وأضاف المؤلف bipll, مصدر
وفقًا لـ OP ، فإن القائمة "طويلة جدًا" ، ولكن هنا يمكنك إنشاء قائمة "طويلة جدًا" 3 لتكرارها فقط
وأضاف المؤلف vaultah, مصدر

يمكنك استخدام الحلقات المتداخلة لـ في تعبير المولد:

>>> mylist = [10, 2, 58]
>>> for i in (x for _ in range(3) for x in mylist):
...     print(i)
0
وأضاف
vaultah. هذا صحيح ، لكن هذا يعني (في رأيي) تناقضًا شجريًا. المسافة البادئة والأسلوب ليسا حصريين. في الواقع ، يمكن للمرء أن يقول المسافة البادئة هو أسلوب جيد !! بادئة هذا الجواب مع المسافة البادئة أمر جيد وسأكون upvote!
وأضاف المؤلف jpp, مصدر
أعتقد أن OP بحاجة إلى توضيح "لماذا لا تتداخل لحلقات قبل أن أتمكن من مشاهدة هذه الإجابة. خلاف ذلك ، هذا هو الحل الممكن لمشكلة غير واضحة.
وأضاف المؤلف jpp, مصدر
jpp: "لأغراض المسافة البادئة/النمط". توضح هذه الإجابة طريقة لوضع حلقات متداخلة على سطر واحد لتجنب التعشيش.
وأضاف المؤلف vaultah, مصدر
على الرغم من أن هذا يستخدم متداخلًا للحلقات ، التي لا يحبها OP لسبب غير معروف ، فمن المحتمل أنه أفضل إجابة. انها بسيطة وذاكرة فعالة.
وأضاف المؤلف mhawke, مصدر

لا ، ما لديك هو جيد بقدر ما يحصل. كل من repeat و chain.from_iterable هما كسلان ، فأنت لا تنشئ نسخًا من القائمة بأكملها. قد ترغب في استخراج ذلك وظيفة منفصلة إذا كنت تستخدمها عدة مرات

See Itertools Recipes

def ncycles(iterable, n):
    "Returns the sequence elements n times"
    from itertools import chain, repeat
    return chain.from_iterable(repeat(iterable, n)) 
    # the general recipe wraps iterable in tuple()
    # to ensure you can walk it multiple times
    # here we know it is always a list

mylist = [10,2,58]

for i in ncycles(mylist, 3):
    print(i)
0
وأضاف
أعتقد أنه من الصواب إعادة نشر الرمز من السؤال كإجابة ، لأنه حل جيد جدًا - أفضل من معظم الحلول الأخرى التي تم نشرها في إجابات أخرى. ولكن ربما يجب عليك أن تشرح لماذا هو حل جيد. ربما تضيف عبارة مثل "الرمز الذي استخدمته بالفعل للحد الأدنى من سعة التخزين الإضافية. إحدى الطرق لتحسينه هي لفه في إحدى الوظائف." أو شيء من هذا القبيل.
وأضاف المؤلف Aran-Fey, مصدر
@ mhawke نعم ، ولكن لم يفكر في سحبها إلى وظيفة
وأضاف المؤلف Caleth, مصدر
OP بالفعل وصلت إلى هذا الحل.
وأضاف المؤلف mhawke, مصدر
رمز التفاف OP في وظيفة ليست في الحقيقة إجابة رغم ذلك.
وأضاف المؤلف mhawke, مصدر