PGS
PGS

Reputation: 1174

Convert string list to list in python

I have a string as below ,

val = '["10249/54","10249/147","10249/187","10249/252","10249/336"]'

I need to parse it and take the values after / and put into list as below

['54','147','187','252','336']

My code: [a[a.index('/')+1:] for a in val[1:-1].split(',')]

Output : ['54"', '147"', '187"', '252"', '336"']

It has double quotes also " which is wrong. After i tried as below

c = []
for a in val[1:-1].split(','):
    tmp = a[1:-1]
    c.append(tmp[tmp.index('/')+1:])

Output :

['54', '147', '187', '252', '336']

Is there any better way to do this?

Upvotes: 5

Views: 7034

Answers (4)

Primusa
Primusa

Reputation: 13498

You can do it in one line using literal_eval:

from ast import literal_eval

val = ['54','147','187','252','336']
a = [i.split('/')[-1] for i in literal_eval(val)]

print(a)

Output:

['54', '147', '187', '252', '336']

literal_eval() converts your string into a list, and then i.split('/')[-1] grabs what's after the slash.

Upvotes: 3

Sohaib Farooqi
Sohaib Farooqi

Reputation: 5666

You can try json module to convert the string to list

>>> import json
>>> val ='["10249/54","10249/147","10249/187","10249/252","10249/336"]'
>>> list(map(lambda x: x.split('/')[-1], json.loads(val)))
>>> ['54', '147', '187', '252', '336']

Upvotes: 1

Fabián Montero
Fabián Montero

Reputation: 1784

Try using regular expressions!

You can do it in a single line this way.

import re

val = '["10249/54","10249/147","10249/187","10249/252","10249/336"]'

output = re.findall('/(\d+)', val) # returns a list of all strings that match the pattern

print(output)

Result: ['54', '147', '187', '252', '336']

re.findall generates a new list called with all the matches of the regexp. Check out the docs on regular expressions for more info on this topic.

Upvotes: 2

g.d.d.c
g.d.d.c

Reputation: 47978

Yeah ... assuming every value has a / like your example, this is superior:

>>> from ast import literal_eval
>>>
>>> val = '["10249/54","10249/147","10249/187","10249/252","10249/336"]'
>>> [int(i.split('/')[1]) for i in literal_eval(val)]
[54, 147, 187, 252, 336]

*edited to insert a forgotten bracket

Upvotes: 2

Related Questions