在列表上迭代格式字符串

Way*_*ner 11 python iteration formatting language-comparisons

在Lisp中,你可以有这样的东西:

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

迭代同一个列表的最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])
Run Code Online (Sandbox Code Playgroud)

但这对我来说感觉很尴尬.我确定有更好的方法吗?


好吧,除非有人后来提供了一个更好的例子,我认为gnibbler的解决方案是最好的\最接近的,尽管它起初可能并不那么明显它是做什么的:

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

Joh*_*ooy 13

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

或使用 .format

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

如果格式字符串没有硬编码,您可以解析它以计算每行的条件数

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

把它们放在一起就可以了

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)
Run Code Online (Sandbox Code Playgroud)


Ken*_*Ken 6

我认为这join是Python中最相似的功能:

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

print(foo.join(", "))
Run Code Online (Sandbox Code Playgroud)

如您所见,当您有多个项目时,情况会更糟,尽管如果您具有分组功能(无论如何确实很有用!),我认为您可以使其工作而不会带来太多麻烦。就像是:

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