Python Forum
Converting list elements and sublists from int to str - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Converting list elements and sublists from int to str (/thread-16681.html)



Converting list elements and sublists from int to str - iMuny - Mar-10-2019

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.


RE: Converting list elements and sublists from int to str - Scorpio - Mar-10-2019

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.


RE: Converting list elements and sublists from int to str - iMuny - Mar-10-2019

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.


RE: Converting list elements and sublists from int to str - perfringo - Mar-10-2019

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']]



RE: Converting list elements and sublists from int to str - Yoriz - Mar-10-2019

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')}]



RE: Converting list elements and sublists from int to str - iMuny - Mar-10-2019

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.