Reputation: 1493
Ok, I have two arrays of tuples. I want to check if array two (in its sub array) has the matching element from array one. If so, I want to append True or False value to the tuple of Array One
e.g. result should be:
[
('Rabbits', [('/home/white', 'white rabbits', False), ('/home/black', 'black rabbits', True), ('/home/green', 'green rabbits', True)]), ('Cats', [('/ans/pink', 'pink cats', True), ('/ans/purple', 'purple cats', False), ('/home/grey', 'grey cats', True)]), ('Hippos', [('/home/red', 'red hippo', False)])]
Array One
[
('Rabbits', [('/home/white', 'white rabbits'), ('/home/black', 'black rabbits'), ('/home/green', 'green rabbits')]), ('Cats', [('/ans/pink', 'pink cats'), ('/ans/purple', 'purple cats'), ('/home/grey', 'grey cats')], ('Hippos', ['/home/red', 'red hippo'])),
]
Array Two
[
('Rabbits', [('/home/black', 'black rabbits'), ('/home/green', 'green rabbits')]), ('Cats', [('/ans/pink', 'pink cats'), ('/home/grey', 'grey cats')]), ('Hippos', [])
]
Current attempt 1: (It given an array will each element appended four times 3x false and 1x True)
def parse_selectedmenu(array_one, array_two):
# boolean flag used when rendering checkbox 'ticked' in template
selected = True
not_selected = False
index = 0
# array_one = list(array_one)
# array_two = list(array_two)
final_array = []
for array_one_name, default_items in array_one:
final_array.append([array_one_name])
# loop through the ticked "made available" items in post data
for array_two_name, custom_items in array_two:
# loop through default sub menu items in default menu
for default_item in default_items:
for custom_item in custom_items:
# if a requested menu item exists in default sub menu
if default_item[0] == custom_item[0] and default_item[1] == custom_item[1]:
if len(default_item) <= 2:
mylist = list(default_item)
# append selcted against matched menu item in default menu items
mylist.append(selected)
default_item_x = tuple(mylist)
default_item = default_item_x
final_array[index].append(default_item)
# print("\n====<<<<<<< ( new 1) SELECTED: item " + str(default_item))
else:
mylist = list(default_item)
# append selcted against matched menu item in default menu items
mylist[2] = selected
default_item_x = tuple(mylist)
default_item = default_item_x
final_array[index].append(default_item)
# print("\n====<<<<<<< (old 2) SELECTED: item " + str(default_item))
if len(default_item) <= 2:
mylist = list(default_item)
# append selcted against matched menu item in default menu items
mylist.append(selected)
default_item_x = tuple(mylist)
default_item = default_item_x
final_array[index].append(default_item)
# print("\n====<<<<<<< ( new 1) SELECTED: item " + str(default_item))
else:
mylist = list(default_item)
# append selcted against matched menu item in default menu items
mylist[2] = selected
default_item_x = tuple(mylist)
default_item = default_item_x
final_array[index].append(default_item)
# print("\n====<<<<<<< (old 2) SELECTED: item " + str(default_item))
index+=1
print("\n====<<<<<<< matched: item " + str(final_array))
return final_array
Attempt Two: (simplified but similar logic). prints same tuples four times with random true or false appended
def parse_menuitem(array_two, array_one):
selected = True
not_selected = False
array_two_list = list(array_two)
array_one_list = list(array_one)
final_array = []
for d_item in def_menu_list[1]:
for c_item in custom_menu_list[1]:
l_d_item = list(d_item)
if d_item[0] == c_item[0] and d_item[1] == d_item[1]:
final_array.append((d_item[0], d_item[1], selected))
else:
final_array.append((d_item[0], d_item[1], not_selected))
print("\n\n----->>> items in menu: " + str(final_array))
def parse_selectedmenu(custom_menus, default_menus):
parsed_menus = []
for d_menu in default_menus:
for c_menu in custom_menus:
m = parse_menuitem(c_menu, d_menu)
parsed_menus.append(m)
Upvotes: 0
Views: 736
Reputation: 10624
There where some parenthesis typos in first array, i have corrected them.
The following code should work:
l1=[('Rabbits', [('/home/white', 'white rabbits'), ('/home/black', 'black rabbits'), ('/home/green', 'green rabbits')]), ('Cats', [('/ans/pink', 'pink cats'), ('/ans/purple', 'purple cats'), ('/home/grey', 'grey cats')]), ('Hippos', [('/home/red', 'red hippo')]), ]
l2=[('Rabbits', [('/home/black', 'black rabbits'), ('/home/green', 'green rabbits')]), ('Cats', [('/ans/pink', 'pink cats'), ('/home/grey', 'grey cats')]), ('Hippos', []) ]
m=[i[1][k] for i in l2 for k in range(len(i[1]))]
for i in range(len(l1)):
for k in range(len(l1[i][1])):
if l1[i][1][k] in m:
l1[i][1][k]+=(True,)
else:
l1[i][1][k]+=(False,)
print(l1)
Upvotes: 0
Reputation: 13079
It looks like you have some minor inconsistencies in your use of parentheses in the input data, and I have taken the liberty of correcting these. With this done, to actually solve the problem I think it makes sense to convert your second array to a dictionary for ease of inclusion testing. This gives:
from pprint import pprint
array_1 = [('Rabbits', [('/home/white', 'white rabbits'),
('/home/black', 'black rabbits'),
('/home/green', 'green rabbits')]),
('Cats', [('/ans/pink', 'pink cats'),
('/ans/purple', 'purple cats'),
('/home/grey', 'grey cats')]),
('Hippos', [('/home/red', 'red hippo')])]
array_2 = [('Rabbits', [('/home/black', 'black rabbits'),
('/home/green', 'green rabbits')]),
('Cats', [('/ans/pink', 'pink cats'),
('/home/grey', 'grey cats')]),
('Hippos', [])]
d = dict(array_2)
out = []
for species, tups in array_1:
lst = []
for tup in tups:
if tup in d[species]:
lst.append(tup + (True,))
else:
lst.append(tup + (False,))
out.append((species, lst))
pprint(out)
Output:
[('Rabbits',
[('/home/white', 'white rabbits', False),
('/home/black', 'black rabbits', True),
('/home/green', 'green rabbits', True)]),
('Cats',
[('/ans/pink', 'pink cats', True),
('/ans/purple', 'purple cats', False),
('/home/grey', 'grey cats', True)]),
('Hippos', [('/home/red', 'red hippo', False)])]
Upvotes: 2