Группировка элементов в списке по классу эквивалентности - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема при попытке создать новые списки из одного списка путем применения наборов.

Предположим, у меня есть следующий список:

L=[[(a),(b),(c)],[(b),(c),(a)],[(a),(c),(b)],[(a),(d),(b)]]

И я хочу просто создать ОДИН списокиз списков в L, которые имеют одинаковые элементы.Мы можем ясно видеть, что:

[(a),(b),(c)], [(b),(c),(a)] and [(a),(c),(b)] 

, если рассматривать их как наборы, они одинаковы, потому что все имеют общие элементы (a), (b) и (c).

Поэтому, если я хочу создать новые списки из L, применяя это правило:

Затем мне понадобятся два новых списка:

[(a),(b),(c)] and [(a),(d),(b)]

, начиная с

[(a),(d),(b)] 

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

Каков оптимальный способ сделать это?Я знаю, как преобразовать элемент внутри L как набор, но если я хочу применить это правило для создания только двух независимых списков, что мне делать?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

A set из frozenset s даст вам примерно то, что вы хотите (хотя это не сохранит порядок):

unique_sets = {frozenset(lst) for lst in L}

Хотя при преобразовании set порядок теряется, преобразованиевернуться к list из list с довольно просто:

unique_lists = [list(s) for s in unique_sets]
0 голосов
/ 20 сентября 2018

Если вы хотите написать hash метод для set, вы можете сделать:

import itertools
[k for k, g in itertools.groupby(sorted([set(y) for y in x], key = your_hash))]
0 голосов
/ 20 сентября 2018

Вы можете сделать set из frozenset с, чтобы получить только уникальные коллекции, игнорирующие порядок и количество предметов:

set(map(frozenset, L))
# {frozenset({'a', 'd', 'b'}), frozenset({'a', 'c', 'b'})}

Тогда преобразовать эти файлы довольно просто.вернуться к спискам:

list(map(list, set(map(frozenset, L))))
# [['a', 'd', 'b'], ['a', 'c', 'b']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...