11

Lisp では、次のようなものを使用できます。

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

同じリストを反復処理する最も 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])

しかし、それは私には厄介に感じます。もっと良い方法があると確信していますか?


まあ、後で誰かがより良い例を提供しない限り、私は gnibbler の解決策が最も良くて最も近いと思いますが、最初はそれがどのように機能するかはそれほど明白ではないかもしれません:

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

6 に答える 6

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)

フォーマット文字列がハードコードされていない場合は、それを解析して 1 行あたりの用語数を計算できます

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)
于 2010-07-01T21:03:42.160 に答える
6

joinはPythonで最も類似した機能だと思います:

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

print(foo.join(", "))

ご覧のとおり、内部に複数の項目がある場合は少し悪いですが、group-by関数 (とにかく便利です!) があれば、それほど問題なく動作させることができると思います。何かのようなもの:

mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print(["%d %d %s" % x for x in group(mystuff, 3)].join("\n"))
于 2010-07-01T20:57:01.913 に答える
4

まず、2.6+ で新しい文字列フォーマット メソッドを使用します。

print "{0} {1} {2}".format(*mystuff[x:x+3])
于 2010-07-01T20:54:42.953 に答える
3

最もPythonicなのは、リストをより深くすることだと思います。

mystuff = [(1, 2, "Foo"), (34, 42, "Ni"), (12, 14, "Blue")]
for triplet in mystuff:
    print "%d %d %s" % triplet
于 2010-07-02T01:44:51.883 に答える
2
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)

とてもわかりやすいと思います

于 2013-08-21T02:36:08.810 に答える