Выполните итерации строки формата по списку

В Lisp у Вас может быть что-то вроде этого:

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

Какова была бы большая часть Pythonic способ выполнить итерации по тому же самому списку? Первая вещь, которая приходит на ум:

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 является nicest\closest, хотя это не может быть вполне как очевидное сначала, как это делает то, что это делает:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
    print "{0} {1} {2}".format(*x)
11
задан Wayne Werner 2 July 2010 в 13:55
поделиться

4 ответа

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)
13
ответ дан 3 December 2019 в 03:17
поделиться

Я думаю, что join является наиболее похожей функцией в Python:

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

print(foo.join(", "))

Это немного хуже, когда у вас есть несколько элементов внутри, как вы видите, хотя если у вас есть group-by (которая в любом случае действительно полезна!), Я думаю, вы можете заставить ее работать без особых проблем. Примерно так:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print(["%d %d %s" % x for x in group(mystuff, 3)].join("\n"))
6
ответ дан 3 December 2019 в 03:17
поделиться

Для начала, я d использовать новые методы форматирования строк в 2.6+

print "{0} {1} {2}".format(*mystuff[x:x+3])
4
ответ дан 3 December 2019 в 03:17
поделиться

Я бы сказал, что самым питоническим было бы сделать список глубже:

mystuff = [(1, 2, "Foo"), (34, 42, "Ni"), (12, 14, "Blue")]
for triplet in mystuff:
    print "%d %d %s" % triplet
3
ответ дан 3 December 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: