187

I've got:

words = ['hello', 'world', 'you', 'look', 'nice']

I want to have:

'"hello", "world", "you", "look", "nice"'

What's the easiest way to do this with Python?

9 Answers 9

331

Update 2021: With f strings in Python3

>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join(f'"{w}"' for w in words)
'"hello", "world", "you", "look", "nice"'

Original Answer (Supports Python 2.6+)

>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
Sign up to request clarification or add additional context in comments.

3 Comments

@Meow that uses repr which is a lil hacky in this specific case as opposed to being clear with the quotes
@jamlak ok, repr just seemed safer to me incase you have quotes in your string.
@Meow good point about the quotes, I guess that this one has the advantage of being explicit while the other approach does support the quotes thing
82

You can try this :

str(words)[1:-1]

2 Comments

how does it add quotes?
This adds single quotation marks instead of double, but quotes inside the words will be automatically escaped. +1 for cleverness.
59

you may also perform a single format call

>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> '"{0}"'.format('", "'.join(words))
'"hello", "world", "you", "look", "nice"'

Update: Some benchmarking (performed on a 2009 mbp):

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.32559704780578613

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; '"{}"'.format('", "'.join(words))""").timeit(1000)
0.018904924392700195

So it seems that format is actually quite expensive

Update 2: following @JCode's comment, adding a map to ensure that join will work, Python 2.7.12

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.08646488189697266

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; '"{}"'.format('", "'.join(map(str, words)))""").timeit(1000)
0.04855608940124512

>>> timeit.Timer("""words = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.17348504066467285

>>> timeit.Timer("""words = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 100; '"{}"'.format('", "'.join(map(str, words)))""").timeit(1000)
0.06372308731079102

6 Comments

does this have a better performance than the one proposed by jamylak?
@sage88 No it isn't. Preoptimization is evil, there is a 0.0000001% chance that the miniscule speed difference here is the entire bottleneck of a Python script. Also this code is much less intuitive so it is not better, it is very slightly faster. My solution is more pythonic and readable
@marchelbling Benchmark is invalid because jamylak' solution works also for iterables of non-strings. Replace .join(words) with .join(map(str, words)) and show us how that goes.
@JCode updated the benchmark. The gap is smaller but there still is a 2x gain on my machine.
@marchelbling Keep in mind that map in Python 2 returns a list but in Python 3 map object generator is returned. I suggested map to express the idea and I didn't know that you used Python 2.
|
9
>>> ', '.join(['"%s"' % w for w in words])

1 Comment

Format is available since python 2.6.
7

An updated version of @jamylak answer with F Strings (for python 3.6+), I've used backticks for a string used for a SQL script.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'

2 Comments

Works, but is it considered to be the canonical pythonic way ?
@MarcelFlygare Yeah f strings seem to be the best way now
1

find a faster way

'"' + '","'.join(words) + '"'

test in Python 2.7:

    words = ['hello', 'world', 'you', 'look', 'nice']

    print '"' + '","'.join(words) + '"'
    print str(words)[1:-1]
    print '"{0}"'.format('", "'.join(words))

    t = time() * 1000
    range10000 = range(100000)

    for i in range10000:
        '"' + '","'.join(words) + '"'

    print time() * 1000 - t
    t = time() * 1000

    for i in range10000:
        str(words)[1:-1]
    print time() * 1000 - t

    for i in range10000:
        '"{0}"'.format('", "'.join(words))

    print time() * 1000 - t

The resulting output is:

# "hello", "world", "you", "look", "nice"
# 'hello', 'world', 'you', 'look', 'nice'
# "hello", "world", "you", "look", "nice"
# 39.6000976562
# 166.892822266
# 220.110839844

Comments

1
words = ['hello', 'world', 'you', 'look', 'nice']
S = ""
for _ in range(len(words)-1):
    S+=f'"{words[_]}"'+', '
S +=f'"{words[len(words)-1]}"'
print("'"+S+"'")

OUTPUT:

'"hello", "world", "you", "look", "nice"'

Comments

0
# Python3 without for loop
conc_str = "'{}'".format("','".join(['a', 'b', 'c']))
print(conc_str) 

# "'a', 'b', 'c'"

1 Comment

This is a blatant duplicate to this answer....10 years later.
0

There are two possible solution and for me we should choose wisely...

items = ['A', 'B', 'C']

# Fast since we used only string concat.
print("\"" + ("\",\"".join(items)) + "\"")

# Slow since we used loop here.
print(",".join(["\"{item}\"".format(item=item) for item in items]))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.