Python 查找元素顺序不重要但重复列表元素重要的重复列表

Python 查找元素顺序不重要但重复列表元素重要的重复列表,python,python-2.7,Python,Python 2.7,我遇到了一个奇怪的问题,我需要找到重复的项目集合,其中顺序不重要,但集合中重复值的存在确实重要。例如,假设我有以下列表: lol = [ ['red'], ['blue', 'orange'], ['orange', 'red'], ['red', 'orange'], ['red', 'red'], ['blue', 'orange', 'red'], ['red', 'orange', 'blue'] ] 就我而言,独特的收藏将是:

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

lol = [
    ['red'],
    ['blue', 'orange'],
    ['orange', 'red'],
    ['red', 'orange'],
    ['red', 'red'],
    ['blue', 'orange', 'red'],
    ['red', 'orange', 'blue']
]
就我而言,独特的收藏将是:

unique_lol = [
    ['red'],
    ['blue', 'orange'],
    ['orange', 'red'],
    ['red', 'red'],
    ['blue', 'orange', 'red']
]
我希望获得的信息是重复列表:

dup_lol = [
    ['orange', 'red'],
    ['blue', 'orange', 'red']
]
我不在乎哪一个副本被报告为副本,即
['orange','red']
vs
['red','orange']
,只是报告了重复的组合。我首先尝试使用了一套冻结套:

sofs = {frozenset(x) for x in lol}
但是,这种方法会被
['red','red']
列表绊倒,该列表会转换为
['red']

set([frozenset(['red']),
     frozenset(['orange', 'red']),
     frozenset(['blue', 'orange', 'red']),
     frozenset(['blue', 'orange'])])
另外,这并没有给我重复的,只有唯一的,而且我不能对列表列表运行差异


我相信我可以重复使用“家长列表”的暴力风格,但我觉得我遗漏了一些简单的东西。我几乎需要一个字典,其中键是有序列表,值是组合出现的次数,但列表不能是字典键,这听起来很奇怪。

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

>>> 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}

如果您的内部列表中项目的顺序通常不重要,我会将它们替换为计数器

>>> lol = [
...     ['red'],
...     ['blue', 'orange'],
...     ['orange', 'red'],
...     ['red', 'orange'],
...     ['red', 'red'],
...     ['blue', 'orange', 'red'],
...     ['red', 'orange', 'blue']
... ]
>>> from collections import Counter
>>> from pprint import pprint
>>> counters = [Counter(x) for x in lol]
>>> pprint(counters)
[Counter({'red': 1}),
 Counter({'orange': 1, 'blue': 1}),
 Counter({'red': 1, 'orange': 1}),
 Counter({'red': 1, 'orange': 1}),
 Counter({'red': 2}),
 Counter({'orange': 1, 'red': 1, 'blue': 1}),
 Counter({'blue': 1, 'red': 1, 'orange': 1})]
要计算计数器,我们需要首先将它们转换为可散列的内容(key,value)-元组的冻结集


很好,我不会跑过柜台。这正是我想要的。非常感谢!
>>> counts = Counter(frozenset(c.iteritems()) for c in counters)
>>> pprint(counts)
{frozenset({('red', 1)}): 1,
 frozenset({('orange', 1), ('red', 1)}): 2,
 frozenset({('blue', 1), ('orange', 1)}): 1,
 frozenset({('blue', 1), ('orange', 1), ('red', 1)}): 2,
 frozenset({('red', 2)}): 1}