Python 在列表上迭代格式字符串

Python 在列表上迭代格式字符串,python,formatting,iteration,language-comparisons,Python,Formatting,Iteration,Language Comparisons,在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

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

对于初学者,我会使用2.6中较新的字符串格式化方法+

print "{0} {1} {2}".format(*mystuff[x:x+3])

我认为
join
是Python中最相似的特性:

(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"))
或者使用
.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)

我想说的是,最具蟒蛇精神的做法是让列表更深入:

mystuff = [(1, 2, "Foo"), (34, 42, "Ni"), (12, 14, "Blue")]
for triplet in mystuff:
    print "%d %d %s" % triplet

基于Wright的两个班轮:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print '\n'.join("{0},{1},{2}".format(*mystuff[x:x+3]) for x in xrange(0, len(mystuff)-1, 3))

很容易理解,我想作为旁白,“尴尬”不是一个非常美妙的词吗?看起来很尴尬!相比之下,它看起来很尴尬,但实际上并没有那么糟糕。+1因为我不知道你是指我的评论还是代码。请不要澄清,模棱两可更有趣!是的,加上一个特殊的生成器函数,你可以让它看起来非常漂亮。是的,我想这取决于你想作弊的程度。你可以把
FORMAT
移植到Python中,如果你周末真的很无聊的话,你可以说
FORMAT(真的,“~{~d~r~s~%~}”,我的东西)
。:-)我被诱惑了!当然,我也希望
~r
也是Python库的一部分。。。sourceforge上已经有了一个模块:我真的很喜欢这个解决方案,一开始我真的很困惑,但在破解了非常优雅的代码之后。这基本上就是gnibblers解决方案创建的:
[x for x in zip(*[iter(mystuff)]*3)]
=
[(1,2,'foo'),(34,42,'ni'),(12,14,'blue')]
非常流畅,嗯?我知道,但我觉得从这个表格开始就更像是蟒蛇。这是最初的问题,对吗?嗯,我有点模棱两可,所以我修正了措辞。我真的对迭代/格式化部分更感兴趣——每次迭代都要消耗一定的列表值。但就整个“程序”而言,您的解决方案更像是python
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print '\n'.join("{0},{1},{2}".format(*mystuff[x:x+3]) for x in xrange(0, len(mystuff)-1, 3))
stuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]

it = iter(stuff)
itn = it.next

print '\n'.join("%d %d %s" % (el,itn(),itn())
                for el in it)