Flatten A List Of Strings Which Contains Sublists
I have a list of strings which contains a sublist os strings: ids = [u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', [u'spotify:track:6oRbm1KOqskL
Solution 1:
You could use a simple loop with an isinstance
check.
out = []
for i in ids:
ifisinstance(i, list):
out.extend(i)
else:
out.append(i)
print(out)
Output:
['spotify:track:3ftnDaaL02tMeOZBunIwls',
'spotify:track:4CKjTXDDWIrS0cwSA9scgk',
'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
'spotify:track:045sp2JToyTaaKyXkGejPy']
You could also use itertools.chain
, but with an extra layer of preprocessing:
from itertools import chain
out = list(chain.from_iterable([i ifisinstance(i, list) else [i] for i in ids]))
print(out)
With the same output.
Solution 2:
You just have to cast any strings to lists:
import itertools
ids = [u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', [u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
u'spotify:track:045sp2JToyTaaKyXkGejPy']]
new_data = list(itertools.chain.from_iterable([[i] ifnotisinstance(i, list) else i for i in b]))
Output:
[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F', u'spotify:track:045sp2JToyTaaKyXkGejPy']
Solution 3:
You can make a function to flatten the list.
defflatten(lst):
ifisinstance(lst, (str, unicode)):
return [lst]
return [unit for item in lst for unit in flatten(item)]
print(flatten(ids))
Solution 4:
You can do:
>>> [x for l in ids for x in (l ifisinstance(l, list) else [l])]
[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F', u'spotify:track:045sp2JToyTaaKyXkGejPy']
Which is similar to your list comprehension of [item for item in ids for item in sublist]
but adding a test to see if it is actually a list we are looking at.
Post a Comment for "Flatten A List Of Strings Which Contains Sublists"