Удалить избыточные подсписки внутри списка в python

#python-3.x #list #duplicates

#python-3.x #Список #дубликаты

Вопрос:

Привет всем, у меня есть список списков значений, таких как :

 list_of_values=[['A','B'],['A','B','C'],['D','E'],['A','C'],['I','J','K','L','M'],['J','M']]
 

и я хотел бы сохранить в этом списке только те списки, в которых у меня наибольшее количество значений.

Например , в sublist1 : ['A','B'] A и B также присутствуют в sublist2 ['A','B','C'] , поэтому я удаляю sublist1 . То же самое для sublist4 . также sublist6 удаляется, потому что J и M присутствовали в a дольше sublist5 .
в конце я должен получить:

 list_of_no_redundant_values=[['A','B','C'],['D','E'],['I','J','K','L','M']] 
 

другой пример =

 list_of_values=[['A','B'],['A','B','C'],['B','E'],['A','C'],['I','J','K','L','M'],['J','M']]
 

ожидаемый результат :

 [['A','B','C'],['B','E'],['I','J','K','L','M']]
 

У кого-нибудь есть идея?

Комментарии:

1. Какого результата вы бы ожидали , если бы у вас были входные [['A', 'B', 'D'], ['A', 'C', 'D', 'E'], ['B', 'F']] данные ? Есть ли гарантия, что элементы меньших списков не будут разделены между множеством разных больших списков?

2. Ожидаемым здесь было бы сохранить весь список, поскольку все ['A', 'B', 'D'] не все присутствуют в ['A', 'C', 'D', 'E'] , то же самое для 'B', 'F']

Ответ №1:

 mylist=[['A','B'],['A','C'],['A','B','C'],['D','E'],['I','J','K','L','M'],['J','M']]
def remove_subsets(lists):
    outlists = lists[:]
    for s1 in lists:
        for s2 in lists:
            if set(s1).issubset(set(s2)) and (s1 is not s2):
                outlists.remove(s1)
                break
    return outlists
print(remove_subsets(mylist))
 

Это должно привести к [['A', 'B', 'C'], ['D', 'E'], ['I', 'J', 'K', 'L', 'M']]

Комментарии:

1. @Grendel, в этом коде была небольшая ошибка. Я обновил его исправлением. Пожалуйста, проверьте это.

2. Нормально ли, что я получаю: ValueError: list.remove(x): x отсутствует в списке для других данных?

3. @Grendel break Отсутствовал. Цикл продолжает проверку, и если снова было совпадение, то вы столкнетесь с упомянутой вами проблемой. Я обновил ответ, чтобы исправить то же самое.