4

假设我有一个相同的元素列表列表(我将int在本例中使用 s )

[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]

什么是取这些列表的交集的好方法和/或有效的方法(所以你会得到每个列表中的每个元素)?例如:

[0, 12, 24, 36, 48, 60, 72, 84, 96]
4

7 回答 7

8

使用具有交集方法的集合。

>>> s = set()
>>> s.add(4)
>>> s.add(5)
>>> s
set([4, 5])
>>> t = set([2, 4, 9])
>>> s.intersection(t)
set([4])

对于您的示例,类似

>>> data = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
>>> sets = map(set, data)
>>> print set.intersection(*sets)
set([0, 96, 36, 72, 12, 48, 84, 24, 60])
于 2010-05-23T21:31:10.203 回答
4

我认为内置set模块应该可以解决问题。

>>> elements = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
>>> sets = map(set, elements)
>>> result = list(reduce(lambda x, y: x & y, sets))
>>> print result
[0, 96, 36, 72, 12, 48, 84, 24, 60]
于 2010-05-23T21:27:48.387 回答
3

将它们转换为集合并使用该set.intersection方法,减少集合列表:

xs = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
reduce(set.intersection, [set(x) for x in xs])

reduce是一种函数式编程设备,它遍历任何可迭代对象并将提供的函数应用于前两个元素,然后应用于结果和下一个元素,然后是那个和下一个元素的结果依此类推。

于 2010-05-23T21:28:14.453 回答
1

我要回答我自己的问题:

lists =  [range(100)[::4],range(100)[::3],range(100)[::2],range(100)[::1]]

out = set(lists[0])
for l in lists[1:]:
    out = set(l).intersection(out)

print out

或者

print list(out)
于 2010-05-23T21:30:05.143 回答
1

这是使用良好的旧all()内置函数的单线:

list(num for num in data[0] 
     if all(num in range_ for range_ in data[1:]))

有趣的是,这(我认为)比使用更大的数据集更具可读性和速度。set

于 2017-05-18T19:59:14.570 回答
0

您可以将它们视为集合并使用set.intersection()

lists = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
sets = [set(l) for l in lists]

isect = reduce(lambda x,y: x.intersection(y), sets)
于 2010-05-23T21:28:46.620 回答
0
l = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
l = [set(i) for i in l]
intersect = l[0].intersection(l[1])
for i in l[2:]:
    intersect = intersect.intersection(i)
于 2010-05-23T21:29:44.930 回答