Sahand
Sahand

Reputation: 8360

List comprehension in format string? (Python)

Let's say I have a list datalist, with len(datalist) = 4. Let's say I want each of the elements in the list to be represented in a string in this way:

s = "'{0}'::'{1}'::'{2}' '{3}'\n".format(datalist[0], datalist[1], datalist[2], datalist[3])

I don't like having to type datalist[index] so many times, and feel like there should be a more effective way. I tried:

s = "'{0}'::'{1}'::'{2}' '{3}'\n".format(datalist[i] for i in range(4))

But this doesn't work:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

Does anybody know a functioning way to achieve this efficiently and concisely?

Upvotes: 7

Views: 5711

Answers (2)

SarahWallace
SarahWallace

Reputation: 1

List comprehension with enumerate() may be what you are looking for. You would not need to reference a list length with enumerate.

_>>enumerate(datalist) will return a tuple numbering the list items starting with default 0.

datalist = ['foo','bar','baz','fizz']    
[print('{}::{} '.format(index,data),end='') for index,data in enumerate(datalist)]
print()  #start new line

Output:

0::foo 1::bar 2::baz 3::fizz 

Upvotes: 0

juanpa.arrivillaga
juanpa.arrivillaga

Reputation: 95948

Yes, use argument unpacking with the "splat" operator *:

>>> s = "'{0}'::'{1}'::'{2}' '{3}'\n"
>>> datalist = ['foo','bar','baz','fizz']
>>> s.format(*datalist)
"'foo'::'bar'::'baz' 'fizz'\n"
>>>

Edit

As pointed out by @AChampion you can also just use indexing inside the format string itself:

>>> "'{0[0]}'::'{0[1]}'::'{0[2]}' '{0[3]}'\n".format(datalist)
"'foo'::'bar'::'baz' 'fizz'\n"

Upvotes: 6

Related Questions