3

順序は重要ではないが、コレクション内の重複値の存在が重要なアイテムの重複コレクションを見つける必要があるという奇妙な問題があります。たとえば、次のリストのリストがあるとします。

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']。重複した組み合わせが報告されるだけです。私は最初に一連のfrozensetsを使用しようとしました:

sofs = {frozenset(x) for x in lol}

ただし、このアプローチは['red', 'red']リストによってつまずき、次のように変換され['red']ます。

set([frozenset(['red']),
     frozenset(['orange', 'red']),
     frozenset(['blue', 'orange', 'red']),
     frozenset(['blue', 'orange'])])

さらに、これは重複ではなく、一意のものだけを提供し、とにかくリストのリストに対して違いを実行することはできません。

親リストのブルートフォーススタイルを反復できると確信していますが、単純なものが欠けているように感じます。キーが順序付けられたリストであり、値がその組み合わせが出現する回数である辞書がほとんど必要ですが、リストは辞書のキーになることはできず、とにかく奇妙に聞こえます。

4

2 に答える 2

2

内部リスト内のアイテムの順序が一般的に問題にならない場合は、それらをカウンターに置き換えます。

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

カウンターをカウントするには、最初にそれらをハッシュ可能なものに変換する必要があります: (キー、値)-タプルの凍結セット。

>>> 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}
于 2013-09-16T01:25:14.413 に答える