سؤال

في Lisp ، يمكنك الحصول على شيء مثل هذا:

(setf my-stuff '(1 2 "Foo" 34 42 "Ni" 12 14 "Blue"))
(format t "~{~d ~r ~s~%~}" my-stuff)

ما هي الطريقة الأكثر إثارة للتكرار على نفس القائمة؟ أول ما يتبادر إلى الذهن هو:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in xrange(0, len(mystuff)-1, 3):
    print "%d %d %s" % tuple(mystuff[x:x+3])

لكن هذا يبدو محرجًا بالنسبة لي. أنا متأكد من أن هناك طريقة أفضل؟


حسنًا ، ما لم يقدم شخص ما لاحقًا مثالًا أفضل ، أعتقد أن حل Gnibbler هو الأقرب ، على الرغم من أنه قد لا يكون واضحًا تمامًا في البداية كيف يفعل ما يفعله:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
    print "{0} {1} {2}".format(*x)
هل كانت مفيدة؟

المحلول

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
    print "%d %d %s"%x

أو باستخدام .format

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
    print "{0} {1} {2}".format(*x)

إذا لم يتم ترميز سلسلة التنسيق ، فيمكنك تحليلها لمعرفة عدد المصطلحات لكل سطر

from string import Formatter
num_terms = sum(1 for x in Formatter().parse("{0} {1} {2}"))

وضع كل شيء معا يعطي

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
fmt = "{0} {1} {2}"
num_terms = sum(1 for x in Formatter().parse(fmt))
for x in zip(*[iter(mystuff)]*num_terms):
    print fmt.format(*x)

نصائح أخرى

أظن join هي الميزة الأكثر تشابها في بيثون:

(format t "~{~D, ~}" foo)

print(foo.join(", "))

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

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print(["%d %d %s" % x for x in group(mystuff, 3)].join("\n"))

بالنسبة للمبتدئين ، سأستخدم طرق تنسيق السلسلة الأحدث في 2.6+

print "{0} {1} {2}".format(*mystuff[x:x+3])

أود أن أقول إن أكثر الأثرية هي جعل القائمة أعمق:

mystuff = [(1, 2, "Foo"), (34, 42, "Ni"), (12, 14, "Blue")]
for triplet in mystuff:
    print "%d %d %s" % triplet
stuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]

it = iter(stuff)
itn = it.next

print '\n'.join("%d %d %s" % (el,itn(),itn())
                for el in it)

مفهوم للغاية ، أعتقد

بطانة مبنية على رايت:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print '\n'.join("{0},{1},{2}".format(*mystuff[x:x+3]) for x in xrange(0, len(mystuff)-1, 3))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top