Это работает, но не сохраняет порядок подсписков:
def bygroup(k):
k = sorted(sorted(x) for x in k)
return [k for k,_ in itertools.groupby(k)]
>>> k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [2, 1]]
>>> bygroup(k)
[[1, 2], [2, 5, 6], [3], [4]]
В Python 2.7 или 3.2 вы можете использовать OrderedDict, если вам нужно сохранить порядок в подсписках, а также общий порядок списка (за исключением дубликатов), но он намного медленнее:
def bydict(k):
s = collections.OrderedDict()
for i in k:
s[tuple(sorted(i))] = i
return s.values()
>>> bydict(k)
[[2, 1], [4], [5, 6, 2], [3]]
Я протестировал 100 000 итераций, используя timeit. Функция Bydict заняла примерно в 4 раза больше времени в Python 2.7.2 и примерно в 3 раза больше в Python 3.2.