Using Python, I have a bunch of lists I want to join some text to. These lists have multi-level entries (or whatever term it is used to describe it), like this:
list1:
(['abc'],
['def', 'ghi'])
list2:
(['123'],
['456', '789'])
I would like to join the string 'X' to each element of both lists:
list1:
(['Xabc'],
['Xdef', 'Xghi'])
list2:
(['X123'],
['X456', 'X789'])
I just can't do it neatly. I did some 'for loops' but it seems incredibly poor, and not reproducible, considering I have several lists:
for index, item in enumerate(list1):
for index2, item2 in enumerate(item):
list1[index][index2] = "X" + item2
for index, item in enumerate(list2):
for index2, item2 in enumerate(item):
list2[index][index2] = "X" + item2
I know this should be a one liner. I found some answers for single simple lists but the ones I have contain multi-level (multi-elements?) and there is more than one list:
list = ["X" + string for string in list]
I just can't adapt this. Any thoughts? Thanks in advance.
You may be interested to learn about slice assignment, if you were concerned about all the indexes you were creating with enumeration and what not.
for b in list1 :
b[:]= ["X"+a for a in b]
Though technically this doesn't do assignment in place (it creates a list for the list comprehension) it will effectively update list1 directly, and doesn't require you to then assign list1 = [list comprehension]
If you want to actually supply individual parameters you would use star to pack the variables into a list.
def update_lists(prepend_text, *lists) :
for list in lists :
update_list(prepend_text, list)
def update_list(prepend_text, list) :
for b in list :
b[:]= [prepend_text+a for a in b]
update_lists("X", list1,list2)
Alternatively you can define the function like this:
def update_lists(prepend_text, lists) :
for list in lists :
update_list(prepend_text, list)
and then call the function as
update_lists("X", [list1,list2])
or perhaps better if you create the list of lists dynamically
lists = []
lists.append(list1)
lists.append(list2)
update_lists("X", lists)
Great, thanks! I did it like this: for c in (list1, list2): for b in c: b[:]= ["X" + a for a in b]
Added some stuff on how to use it in a function for multiple lists.