Reputation: 51857
In Lisp, you can have something like this:
(setf my-stuff '(1 2 "Foo" 34 42 "Ni" 12 14 "Blue"))
(format t "~{~d ~r ~s~%~}" my-stuff)
What would be the most Pythonic way to iterate over that same list? The first thing that comes to mind is:
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])
But that just feels awkward to me. I'm sure there's a better way?
Well, unless someone later provides a better example, I think gnibbler's solution is the nicest\closest, though it may not be quite as apparent at first how it does what it does:
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
print "{0} {1} {2}".format(*x)
Upvotes: 11
Views: 25505
Reputation: 27585
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)
Very understandable, I think
Upvotes: 2
Reputation: 375
A two liner based on 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))
Upvotes: 0
Reputation: 25271
I'd say the most Pythonic would be to make the list deeper:
mystuff = [(1, 2, "Foo"), (34, 42, "Ni"), (12, 14, "Blue")]
for triplet in mystuff:
print "%d %d %s" % triplet
Upvotes: 3
Reputation: 304355
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
print "%d %d %s"%x
Or using .format
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
print "{0} {1} {2}".format(*x)
If the format string is not hardcoded, you can parse it to work out how many terms per line
from string import Formatter
num_terms = sum(1 for x in Formatter().parse("{0} {1} {2}"))
Putting it all together gives
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)
Upvotes: 13
Reputation: 10611
I think join
is the most similar feature in Python:
(format t "~{~D, ~}" foo)
print(foo.join(", "))
It's a little worse when you have multiple items inside, as you see, though if you have a group-by function (which is really useful anyway!), I think you can make it work without too much trouble. Something like:
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
print(["%d %d %s" % x for x in group(mystuff, 3)].join("\n"))
Upvotes: 6
Reputation: 2505
For starters, I'd use the newer string formatting methods in 2.6+
print "{0} {1} {2}".format(*mystuff[x:x+3])
Upvotes: 4