Reputation: 1174
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
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
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
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
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