查找元素顺序无关紧要的重复列表,但重复列表元素很重要

Fiv*_*ver 3 python python-2.7

我有一个奇怪的问题,我需要找到重复的项目集合,其中顺序无关紧要,但集合中存在重复值确实很重要.例如,假设我有以下列表列表:

lol = [
    ['red'],
    ['blue', 'orange'],
    ['orange', 'red'],
    ['red', 'orange'],
    ['red', 'red'],
    ['blue', 'orange', 'red'],
    ['red', 'orange', 'blue']
]
Run Code Online (Sandbox Code Playgroud)

就我而言,唯一的集合将是:

unique_lol = [
    ['red'],
    ['blue', 'orange'],
    ['orange', 'red'],
    ['red', 'red'],
    ['blue', 'orange', 'red']
]
Run Code Online (Sandbox Code Playgroud)

我想要获取的信息是重复列表:

dup_lol = [
    ['orange', 'red'],
    ['blue', 'orange', 'red']
]
Run Code Online (Sandbox Code Playgroud)

我不关心哪个副本报告为重复,即['orange', 'red']vs ['red', 'orange'],只报告重复组合.我首先尝试使用一组frozensets:

sofs = {frozenset(x) for x in lol}
Run Code Online (Sandbox Code Playgroud)

但是,这种方法被['red', 'red']列表绊倒了,它被转换为['red']:

set([frozenset(['red']),
     frozenset(['orange', 'red']),
     frozenset(['blue', 'orange', 'red']),
     frozenset(['blue', 'orange'])])
Run Code Online (Sandbox Code Playgroud)

另外,这并没有给我重复,只有独特的重复,无论如何我无法对列表列表产生差异.

我确信我可以迭代父级列表暴力风格,但我觉得我错过了一些简单的东西.我几乎需要一个字典,其中键是有序列表,值是组合出现的次数,但列表不能是字典键,而且听起来也很奇怪.

jte*_*ace 7

我想你要找的是柜台.对每个条目进行排序,然后将其转换为元组,以便进行比较.计数器将跟踪每个唯一条目的计数:

>>> from collections import Counter
>>> counted = Counter(tuple(sorted(entry)) for entry in lol)
>>> import pprint
>>> pprint.pprint(dict(counted))
{('blue', 'orange'): 1,
 ('blue', 'orange', 'red'): 2,
 ('orange', 'red'): 2,
 ('red',): 1,
 ('red', 'red'): 1}
Run Code Online (Sandbox Code Playgroud)