149

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?

philipxy
  • 14,416
  • 5
  • 32
  • 77
kadrian
  • 4,401
  • 8
  • 35
  • 60

6 Answers6

255

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"'
jamylak
  • 120,885
  • 29
  • 225
  • 225
  • 1
    @Meow that uses `repr` which is a lil hacky in this specific case as opposed to being clear with the quotes – jamylak May 03 '17 at 02:47
  • 1
    @jamlak ok, repr just seemed safer to me incase you have quotes in your string. – Meow May 03 '17 at 23:29
66

You can try this :

str(words)[1:-1]
Thykof
  • 770
  • 6
  • 9
55

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
marchelbling
  • 1,949
  • 15
  • 23
  • does this have a better performance than the one proposed by jamylak? – kadrian Aug 17 '12 at 15:27
  • 3
    This is a better solution than the accepted answer. – sage88 Apr 17 '15 at 02:53
  • 2
    @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 – jamylak Oct 15 '16 at 01:14
  • @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. – WloHu Oct 19 '17 at 07:51
  • @JCode updated the benchmark. The gap is smaller but there still is a 2x gain on my machine. – marchelbling Oct 19 '17 at 13:33
  • @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. – WloHu Oct 20 '17 at 15:37
  • If there are no items in the list this returns `""` empty double quotes instead of an empty string. – bdrx Oct 14 '20 at 16:57
7
>>> ', '.join(['"%s"' % w for w in words])
jamylak
  • 120,885
  • 29
  • 225
  • 225
Emmett Butler
  • 5,469
  • 2
  • 28
  • 46
4

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`'
Gruber
  • 2,003
  • 4
  • 25
  • 45
0

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
geertjanvdk
  • 3,270
  • 22
  • 26
Luna
  • 1
  • 1