Ramesh Rajan
Ramesh Rajan

Reputation: 43

splitting a list in a better way using list comprehension

I have a simple list that I am splitting and concatenating. My code uses for loop and if condition and ugly. Can you suggest a better way using list comprehension?

My code

mylist = ['10.10.10.1','10.10.10.2,10.10.10.3,10.10.10.4,10.10.10.5','10.10.10.6']

mylist = [i.split(",") for i in mylist] 
list =[]
for x,y in enumerate(mylist):
    if len(y) == 1:
        list.append(y[0])
    else:
        for z in y:
            list.append(z)
print(list)

I am getting the below result and exactly the way i want ['10.10.10.1','10.10.10.2','10.10.10.3','10.10.10.4','10.10.10.5','10.10.10.6']

Upvotes: 0

Views: 57

Answers (4)

RoadRunner
RoadRunner

Reputation: 26315

You can first just split each string on ',':

>>> mylist = ['10.10.10.1','10.10.10.2,10.10.10.3,10.10.10.4,10.10.10.5','10.10.10.6']
>>> split_str = [x.split(',') for x in mylist]
>>> split_str
[['10.10.10.1'], ['10.10.10.2', '10.10.10.3', '10.10.10.4', '10.10.10.5'], ['10.10.10.6']]

Then if you want to flatten it, you can use itertools.chain.from_iterable:

>>> from itertools import chain
>>> list(chain.from_iterable(split_str))
['10.10.10.1', '10.10.10.2', '10.10.10.3', '10.10.10.4', '10.10.10.5', '10.10.10.6']

Upvotes: 0

Stefan Pochmann
Stefan Pochmann

Reputation: 28596

Not a comprehension, but good anyway, I think.

','.join(mylist).split(',')

Upvotes: 1

Varad
Varad

Reputation: 1022

I agree with @juanpa.arrivillaga. However hope we can avoid that second looping since he is checking for empty values returning while splitting

In [7]: s=['10.10.10.1','','10.10.10.2,10.10.10.3,10.10.10.4,10.10.10.5','10.10.10.6']

In [8]: [splitRec for rec in s for splitRec in rec.split(',') if splitRec]
Out[8]: 
['10.10.10.1',
 '10.10.10.2',
 '10.10.10.3',
 '10.10.10.4',
 '10.10.10.5',
 '10.10.10.6']

In [9]: s=['10.10.10.1',',,','10.10.10.2,10.10.10.3,10.10.10.4,10.10.10.5','10.10.10.6']

In [10]: [splitRec for rec in s for splitRec in rec.split(',') if splitRec]Out[10]: 
['10.10.10.1',
 '10.10.10.2',
 '10.10.10.3',
 '10.10.10.4',
 '10.10.10.5',
 '10.10.10.6']

Upvotes: 1

juanpa.arrivillaga
juanpa.arrivillaga

Reputation: 95883

You want:

[s for string in mylist for s in string.split(',')]

Note, your original approach wouldn't be so bad if you just simplified. No need for enumerate and no need to check the length, so just:

final_list =[]
for sub in mylist:
    for s in sub:
         final_list.append(s)

By the way, you shouldn't shadow the built-in list. Use another name

Upvotes: 3

Related Questions