billy
billy

Reputation: 1493

Checking for matching values in an array of tuples - python

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

Answers (2)

IoaTzimas
IoaTzimas

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

alani
alani

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

Related Questions