Python Forum

Full Version: Converting list elements and sublists from int to str
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello everyone, I'm new to python and currently stuck on a problem,I want to convert a list containing variable data types to strings while maintaining the original structure of the lists, for e.g.

inputlist=['Cities',14,'WACC',(32,'KHI',208.55567),['Stat',14,'RS0']]
Should become

outputlist=['Cities','14','WACC',('32','KHI','208.55567'),['Stat','14','RS0']]
Map doesn't work as it converts the inner tuples and lists to a complete string breaking the original structure.
outputlist=list(map(str,inputlist))
The lists are variable sized with changing internal structures and can be long containing thousands of elements with each element having the possibility of being a tuple or list itself.

Any help would be greatly appreciated.
hi,

you want to use the right method but not with the right way.

for using map, the first item is a fonction type lambda.

for using lambda, if "x" is your variable for iteration, you can do that :

outputlist= list(map(lambda x: str(x), inputlist))
hope this will be helpful.
Thanks for the answer but there is still a little problem as you may have observed that the inner tuple and list get converted to a string, I only want their elements to get converted to strings not the whole tuple/list.

Like a recursive function or something.

Any help would be highly appreciated.
Does "with changing internal structures" mean that list in not always one level deep as in "inputlist"?

If list is only one level deep simple brute-force conversion should suffice. One possibility:

>>> inputlist=['Cities',14,'WACC',(32,'KHI',208.55567),['Stat',14,'RS0']]
>>> outputlist = list()
>>> for el in inputlist: 
...     obj_type = type(el)
...     if isinstance(el, (list, tuple)):           # alternatively: if obj_type in [tuple, list]:
...         outputlist.append([str(x) for x in el])
...         if obj_type == tuple:
...             outputlist[-1] = obj_type(outputlist[-1])
...     else:
...         outputlist.append(str(el))
...
>>> outputlist
['Cities', '14', 'WACC', ('32', 'KHI', '208.55567'), ['Stat', '14', 'RS0']]
A recursive version, be careful with dictionary keys.
test_data = ['Cities', 14, 'WACC', (32, 'KHI', 208.55567), ['Stat', 14, 'RS0'],
           {'one': 1, 2: [1, 2], (1, 2, 3, 4): ('this', 'that', 10)},
           {1, 2, (3.0, 3.5,), 4}]


def all_strings(data):
    if type(data) == list:
        items = []
        for item in data:
            items.append(all_strings(item))
        return items
    
    elif type(data) == tuple:
        return tuple(all_strings(list(data)))
    
    elif type(data) == dict:
        new_dict = {}
        for key, value in data.items():
            new_dict[all_strings(key)] = all_strings(value)
        return new_dict
    
    elif type(data) == set:
        return set(all_strings(list(data)))

    else:
        return str(data) 


print(all_strings(test_data))
Output:
['Cities', '14', 'WACC', ('32', 'KHI', '208.55567'), ['Stat', '14', 'RS0'], {'one': '1', '2': ['1', '2'], ('1', '2', '3', '4'): ('this', 'that', '10')}, {'4', '2', '1', ('3.0', '3.5')}]
Thankyou perfringo and yoriz your answers solved my problem, the list will be atmost one level deep in 95% of the cases, as such both answers are perfect.

Thankyou for your help.