Zixxy7
Zixxy7

Reputation: 71

Find Numbers in a List Consisting of Strings and Convert them to Floats

I'm trying to do an exercise where I have a list:

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']

And I have to make a second list out of it that looks like this:

list_2 = [['chocolate', 1.20], ['book', 5.50], ['hat', 3.25]]

In the second list the numbers have to be floats and without the ' '

So far I've come up with this code:

for item in list_1:
    list_2.append(item.split(';'))

The output looks about right:

[['chocolate', '1.20'], ['book', '5.50'], ['hat', '3.25']]

But how do I convert those numbers into floats and remove the double quotes?

I tried:

for item in list_2:
    if(item.isdigit()):
        item = float(item)

Getting:

AttributeError: 'list' object has no attribute 'isdigit'

Upvotes: 3

Views: 322

Answers (7)

unltd_J
unltd_J

Reputation: 494

For a problem like this you can initialize two variables for the result of calling the split function and then append a list of both values and call the builtin float function on the second value.

array = []
for i in a_list:
    string, number = i.split(";")
    array.append([string, float(number)])

print(array)

Upvotes: 0

Rafał
Rafał

Reputation: 705

You can use a function map to convert each value.

def modify_element(el): 
    name, value = el.split(';')
    return [name, float(value)]

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']

result = list(map(modify_element, list_1))

Upvotes: 0

Chris
Chris

Reputation: 36611

This can be achieved in two lines of code using list comprehensions.

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']
list_2 = [[a, float(b)] for x in list_1 for a, b in [x.split(';', 1)]]

The second "dimension" to the list comprehension generates a list with a single sublist. This lets us essentially save the result of splitting each item and then bind those two items to a and b to make using them cleaner that having to specify indexes.

Note: by calling split with a second argument of 1 we ensure the string is only split at most once.

Upvotes: 0

user18918345
user18918345

Reputation:

I don't know if this helpful for you. But,I think using function is better than just using simple for loop Just try it.

def list_map(string_val,float_val):
    return [string_val,float_val]

def string_spliter(list_1):
    string_form=[]
    float_form=[]
    
    for string in list_1:
        str_val,float_val=string.split(";")
        string_form.append(str_val)
        float_form.append(float_val)
    return string_form,float_form

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']
    
string_form,float_form=string_spliter(list_1)
float_form=list(map(float,float_form))
output=list(map(list_map,string_form,float_form))

print(output)

Upvotes: 1

StBlaize
StBlaize

Reputation: 587

Your way of creating list_2 is fine. To then make your new list, you can use final_list = [[i[0], float(i[1])] for i in list_2]

You could also do it in the for loop like this:

for item in list_1:
  split_item = item.split(';')
  list_2.append([split_item[0], float(split_item[1])])

Upvotes: 0

Barmar
Barmar

Reputation: 781761

item is a list like ['chocolate', '1.20']. You should be calling isdigit() on item[1], not item. But isdigit() isn't true when the string contains ., so that won't work anyway.

Put the split string in a variable, then call float() on the second element.

for item in list_1:
    words = item.split(';')
    words[1] = float(words[1])
    list_2.append(words)

Upvotes: 1

William Rosenbaum
William Rosenbaum

Reputation: 355

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']
list_2 = [x.split(';') for x in list_1]
list_3 = [[x[0], float(x[1])] for x in list_2]

Upvotes: 1

Related Questions