user7830303
user7830303

Reputation:

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:6oRbm1KOqskLTFc1rvGi5F',
u'spotify:track:045sp2JToyTaaKyXkGejPy']]

I tried to flatten it with:

[item for item in ids for item in sublist]

and

chain = itertools.chain(ids)

but these solutions split the strings...

how do I flatten the original list into

[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',u'spotify:track:045sp2JToyTaaKyXkGejPy']

?

Upvotes: 0

Views: 196

Answers (4)

dawg
dawg

Reputation: 103874

You can do:

>>> [x for l in ids for x in (l if isinstance(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.

Upvotes: 0

cs95
cs95

Reputation: 402573

You could use a simple loop with an isinstance check.

out = []
for i in ids:
    if isinstance(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 if isinstance(i, list) else [i] for i in ids]))
print(out)    

With the same output.

Upvotes: 2

Oluwafemi Sule
Oluwafemi Sule

Reputation: 38962

You can make a function to flatten the list.

def flatten(lst):
  if isinstance(lst, (str, unicode)):
    return [lst]
  return [unit for item in lst for unit in flatten(item)]

print(flatten(ids))

Upvotes: 0

Ajax1234
Ajax1234

Reputation: 71451

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] if not isinstance(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']

Upvotes: 0

Related Questions