Posts: 24
Threads: 9
Joined: Mar 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.
Posts: 15
Threads: 4
Joined: Jan 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.
Posts: 24
Threads: 9
Joined: Mar 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.
Posts: 1,950
Threads: 8
Joined: Jun 2018
Mar-10-2019, 05:01 PM
(This post was last modified: Mar-10-2019, 05:01 PM by perfringo.)
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']]
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy
Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Posts: 2,168
Threads: 35
Joined: Sep 2016
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')}]
Posts: 24
Threads: 9
Joined: Mar 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.
|