首页 > 解决方案 > 检查元组数组中的匹配值 - python

问题描述

好的,我有两个元组数组。我想检查数组二(在其子数组中)是否具有数组一中的匹配元素。如果是这样,我想将 True 或 False 值附加到Array One的元组

例如结果应该是:

[
('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)])]

阵列一

[
('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'])), 
]

数组二

[
('Rabbits', [('/home/black', 'black rabbits'), ('/home/green', 'green rabbits')]), ('Cats', [('/ans/pink', 'pink cats'), ('/home/grey', 'grey cats')]), ('Hippos', []) 
]

当前尝试 1:(它给定一个数组,每个元素将附加四次 3x false 和 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

尝试二:(简化但类似的逻辑)。打印相同的元组四次,附加随机真或假

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)

标签: pythonarrayslistalgorithmtuples

解决方案


看起来您在输入数据中使用括号时存在一些细微的不一致,我冒昧地更正了这些。完成此操作后,要实际解决问题,我认为将第二个数组转换为字典以便于包含测试是有意义的。这给出了:

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)

输出:

[('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)])]

推荐阅读