2015-10-31 9 views
0

Удаление суперсетами когда подсписки сравнивают с другими подсписков в течение list_of_listsматч питона список

Вход:

my_list = [['cat','bat'],['sat','rat','mat'],['cat','bat','hat'],['pat','mat']] 

Здесь [ «кошка», «летучая мышь»] является подмножеством [ «кошка», 'летучая мышь', 'шляпа'] Так что мне нужно, чтобы удалить супернабор [ 'кошка', 'летучая мышь', 'шапка'] из my_list

Желаемая Вывод должен быть:

my_new_list = [['cat','bat'],['sat','rat','mat'],['pat','mat']] 

Я нашел подобный поток, но не смог реализовать тот же код для сравнения подсписок друг с другом. Кто-нибудь может мне с этим помочь?

def match(my_list[],my_list[]): 
     matches = set(my_list[]).issuperset() 
     return [remove(my_list[]) for sublist in my_list if matches (sublist)] 

ответ

1

В основном вы хотите отфильтровать список по критерию. Включите данные в тип, где критерий легко может быть применен как set и применить список:

Понимание

listmatching.py

def get_top_sets(mylist): 
    """ Returns a list of minimal subsets of the original""" 
    m = [set(sublist) for sublist in mylist] # Convert into list of sets 
    # If there is no element t that is a subset of s, add s to the new list 
    return [list(s) for s in m if not any(not s == t and t.issubset(s) for t in m)] 

Здесь мы проверяем, существует ли какой-либо элемент, который является подмножеством текущего элемента. Если проверка не удалась, нет такого элемента, и у нас есть элемент, который не является подмножеством какого-либо другого, и мы можем добавить его в наш новый список.

Переводчик:

>>> from listmatching import get_top_sets 
>>> my_list = [['cat','bat'],['sat','rat','mat'],['cat','bat','hat'],['pat','mat']] 
>>> print get_top_sets(my_list) 
[['bat', 'cat'], ['rat', 'mat', 'sat'], ['pat', 'mat']] 

Мы превращаем его обратно в исходное list типа внутри списка понимания.

+0

определение функции соответствия (MyList): MyList = [множество (Подсписок) для подсписка в MyList] mynewlist = [список (подмножество) для подмножества в MyList, если не any (not subset == testset и subset.isubset (testset))] return mylist' – Belle

+0

Я отредактировал мое сообщение, вы хотите новую версию :) –

2

Взгляните на это:

from itertools import permutations 

my_list = [['cat','bat'],['sat','rat','mat'],['cat','bat','hat'],['pat','mat']] 

for a,b in permutations(my_list,2): 
    if set(a).issubset(b): 
     my_list.remove(b) 
print my_list 
Смежные вопросы