2

Python 2.5.4 を使用しています。ここから: Python - 複数のリストの交差?

私はこれを持っています:

def intersect(*d):
    sets = iter(map(set, d))
    result = sets.next()
    for s in sets:
        result = result.intersection(s)
    return result

以下は期待どおりに機能します。

intersect([1,2,3,4], [2,3,4], [3,4,5,6,7])

しかし、次のようなものがあります。

d=[ [1,2,3,4], [2,3,4], [3,4,5,6,7] ]

私がそれを次のように呼び出すと:

intersect(d)

私は得る:

TypeError: list objects are unhashable

d上記を取ることができるものに変換するにはどうすればよいintersect()ですか?

4

3 に答える 3

10

リストの内容を個別のパラメーターとして渡す必要があります。

intersect(*d)

そうしないと、リスト全体が 1 つのセットとして使用されてしまいます。この構文は、リスト全体を 1 つのパラメーターとして使用するのではなく、一連のパラメーターとして関数に*d使用することを Python に示します。dd

于 2012-11-16T21:27:32.380 に答える
1

Martijnの答えは正しいです。これは、はるかに単純でおそらく効率的な方法で実行できることを付け加えたいと思います。

s = set(d[0]).intersection(*d[1:])

例:

>>> d = [ [1,2,3,4], [2,3,4], [3,4,5,6,7] ]
>>> set(d[0]).intersection(*d[1:])
set([3, 4])

免責事項-これはPython2.7でテストされました。2.5についてはわかりません

于 2012-11-16T21:41:05.773 に答える
1

これを実装する別の方法を次に示します。

d = [ [1,2,3,4], [2,3,4], [3,4,5,6,7] ]

reduce((lambda x, y: x & y), map(set, d))

また

reduce(operator.and_, map(set, d))

これは、2.5 以前のバージョンでも有効です。

于 2012-11-16T22:33:16.777 に答える