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)

否则会发生整个列表被用作一组而不是。该*d语法向 Python 表明您希望将其d用作函数的一系列参数,而不是将整个d列表仅用作一个参数。

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

免责声明——这是在 python 2.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 回答