Хорошо, у меня есть два массива кортежей. Я хочу проверить, есть ли у второго массива (в его подмассиве) соответствующий элемент из первого массива. Если это так, я хочу добавить значение True или False в кортеж первого массива .

например, результат должен быть:

[
('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: (при заданном массиве к каждому элементу добавляется четыре раза, 3 раза ложно и 1 раз истинно)

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)
0
Shaz 3 Сен 2020 в 08:57

2 ответа

Лучший ответ

Похоже, у вас есть незначительные несоответствия в использовании скобок во входных данных, и я взял на себя смелость исправить их. После этого, чтобы решить проблему, я думаю, имеет смысл преобразовать ваш второй массив в словарь для упрощения тестирования включения. Это дает:

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)])]
2
alani 3 Сен 2020 в 06:17

Там, где в первом массиве были опечатки в круглых скобках, я их исправил.

Следующий код должен работать:

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)
0
archer 3 Сен 2020 в 06:52