对列表迭代格式字符串
在Lisp语言中,你可以这样写:
(setf my-stuff '(1 2 "Foo" 34 42 "Ni" 12 14 "Blue"))
(format t "~{~d ~r ~s~%~}" my-stuff)
那么在Python中,最优雅的方式来遍历同样的列表是什么呢?我首先想到的是:
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)
6 个回答
4
首先,我建议你使用2.6及以上版本中更新的字符串格式化方法。
print "{0} {1} {2}".format(*mystuff[x:x+3])
6
我觉得在Python中,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"))
13
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)