对列表迭代格式字符串

11 投票
6 回答
25108 浏览
提问于 2025-04-16 00:42

在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)

撰写回答