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)
我认为这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)
| 归档时间: |
|
| 查看次数: |
18966 次 |
| 最近记录: |