Reputation:
I am trying to append elements from a multi-dimensional list into a 2nd multi-dimensional list. Here is the code I wrote -
my_list = [[['b', ['a'], 'c'], ['d', ['a', 'b'], 'e']],
[['j', ['a', 'f']], ['q', 't']]]
ref_list = [[['q', 'w', 't'], ['y', 'u']],
[['s', 'o'], ['p', 'k', 'l']]]
newlist = []
for num, i in enumerate(my_list):
small_list = []
for num_1, j in enumerate(i):
semilist = []
for k in j:
if isinstance(k, list):
onelist = []
for a in k:
for ii in ref_list[num][num_1]:
onelist.append(ii)
semilist.append(onelist)
else:
semilist.append(k)
small_list.append(semilist)
newlist.append(small_list)
print(newlist)
The output I am getting is -
[[['b', ['q', 'w', 't'], 'c'], ['d', ['y', 'u', 'y', 'u'], 'e']], [['j', ['s', 'o', 's', 'o']], ['q', 't']]]
The output I am looking for is of sort -
[[['b', ['q', 'w', 't'], 'c'], ['d', ['y', 'u'], 'e']], [['j', ['s', 'o']], ['p', 'k', 'l']]]
I want to replace elements of innermost list of "my_list" with the elements of the "ref_list".
Upvotes: 3
Views: 147
Reputation: 195428
Try:
my_list = [
[["b", ["a"], "c"], ["d", ["a", "b"], "e"]],
[["j", ["a", "f"]], ["q", "t"]],
]
ref_list = [[["q", "w", "t"], ["y", "u"]], [["s", "o"], ["p", "k", "l"]]]
for a, b in zip(my_list, ref_list):
for i, subl in enumerate(a):
for ii, v in enumerate(subl):
if isinstance(v, list):
subl[ii] = b[i]
break
else:
a[i] = b[i]
print(my_list)
Prints:
[
[["b", ["q", "w", "t"], "c"], ["d", ["y", "u"], "e"]],
[["j", ["s", "o"]], ["p", "k", "l"]],
]
EDIT: To append elements from 2nd list instead replacing:
my_list = [
[["b", ["a"], "c"], ["d", ["a", "b"], "e"]],
[["j", ["a", "f"]], ["q", "t"]],
]
ref_list = [[["q", "w", "t"], ["y", "u"]], [["s", "o"], ["p", "k", "l"]]]
for a, b in zip(my_list, ref_list):
for i, subl in enumerate(a):
for ii, v in enumerate(subl):
if isinstance(v, list):
subl[ii].extend(b[i])
break
else:
a[i].extend(b[i])
print(my_list)
Prints:
[
[["b", ["a", "q", "w", "t"], "c"], ["d", ["a", "b", "y", "u"], "e"]],
[["j", ["a", "f", "s", "o"]], ["q", "t", "p", "k", "l"]],
]
EDIT2: To add elements of 2nd list at the beginning of first list:
my_list = [
[["b", ["a"], "c"], ["d", ["a", "b"], "e"]],
[["j", ["a", "f"]], ["q", "t"]],
]
ref_list = [[["q", "w", "t"], ["y", "u"]], [["s", "o"], ["p", "k", "l"]]]
for a, b in zip(my_list, ref_list):
for i, subl in enumerate(a):
for ii, v in enumerate(subl):
if isinstance(v, list):
subl[ii] = b[i] + subl[ii]
break
else:
a[i] = b[i] + a[i]
print(my_list)
Prints:
[
[["b", ["q", "w", "t", "a"], "c"], ["d", ["y", "u", "a", "b"], "e"]],
[["j", ["s", "o", "a", "f"]], ["p", "k", "l", "q", "t"]],
]
Upvotes: 0
Reputation: 23146
Try:
ref_list_flat = [l for sublist in ref_list for l in sublist]
for i, l1 in enumerate(my_list):
for j, l2 in enumerate(l1):
#check if this is the innermost list
if not any(isinstance(l3, list) for l3 in l2):
my_list[i][j] = ref_list_flat.pop(0)
else:
for k, l3 in enumerate(l2):
if isinstance(l3, list):
my_list[i][j][k] = ref_list_flat.pop(0)
>>> my_list
[[['b', ['q', 'w', 't'], 'c'], ['d', ['y', 'u'], 'e']],
[['j', ['s', 'o']], ['p', 'k', 'l']]]
Upvotes: 1