decemberrobot
decemberrobot

Reputation: 531

Python Split if there is only one element

I am trying to do a Python Split but there seems to be a problem with my logic.

I have some data, separated with a semicolon. Some example of my data would be like:

I only want to retrieve one value from each row. Like for example in row 1, i only want the last value which is 20, and i want 40 from the second row.

I tried using the following code:

fields = fields.split(";")[-1]

It works for the first row, i got 20. but i am unable to get the data from second row as it has only one element in the split.

Then I tried using an if-else condition like below but the code is unable to run.

if (len(fields.split(";")) > 0):

    fields = fields.split(";")[-1]
else:
    pass

Anybody knows how to deal with this problem ? What I am achieve is that if there is only 1 value in that row I will read it. If there is more than one value, I split it and take the last value.

Upvotes: 0

Views: 2554

Answers (3)

Another way is to use re module.

from re import findall

s1 = '80;778;20'
s2 = '40'

res1 = findall( '\d+', s1)
res2 = findall( '\d+', s2)

print res1[-1]
print res2[-1]

Upvotes: 0

Wasi Ahmad
Wasi Ahmad

Reputation: 37741

So, if you see when you split the string - '40;' using semicolon (;), you get a list of two strings - ['40', '']. So, fields.split(";")[-1] returns an empty string for the input '40;'.

So, either you strip the last semicolon ; before splitting as follows.

print('40;'.rstrip(';').split(';')[-1])

OR, you can do:

fields = '40;'.split(';')
if fields[-1]:
    print(fields[-1])
else:
    print(fields[-2])

I prefer the first approach than the if/else approach. Also, have a look at the .strip(), .lstrip(), .rstrip() functions.

Upvotes: 0

cizixs
cizixs

Reputation: 13981

Use strip to normalize input, the problem is there is an extra ; for one number situation, so we should remove it first.

In [1]: def lnum(s):
   ...:     return s.strip(';').split(';')[-1]
   ...: 

In [2]: lnum('89;50;20')
Out[2]: '20'

In [3]: lnum('89;')
Out[3]: '89'

In [5]: lnum('10;')
Out[5]: '10'

Upvotes: 2

Related Questions