2012-10-08 268 views
2

目前我被困在试图找到三个交集。现在这些集合是真正的列表,我转换成集合,然后试图找到交集。python中三个集合的交集?

这是我到目前为止有:

for list1 in masterlist: 
    list1 = thingList1 
for list2 in masterlist: 
    list2 = thingList2 
for list3 in masterlist: 
    list3 = thingList3 

d3 = [set(thingList1), set(thingList2), set(thingList3)] 
setmatches c = set.intersection(*map(set,d3)) 
print setmatches 

和我越来越

set([]) 
Script terminated. 

我知道有一个更简单,更好的方式来做到这一点,但我无法找到一个...

编辑

好了,这里的我现在拥有的。

setList=() 
setList2=() 
setList3=() 

for list1 in masterlist: 
    setList=list1 
    for list2 in masterlist: 
     setList2=list2 
     for list3 in masterlist: 
      setList3=list3 



setmatches=set(setList) & set(setList2) & set(setList3) 
print setmatches 

仍然没有给我什么我在寻找:这是一个比赛我保证在每个列表。它给了我看起来像所有套件的增加。

+0

你的问题似乎暗示输出是一个问题,或意外。某种程度上输出与问题有关吗?你确定每个列表都有共同的元素吗? –

+1

你的代码的第一部分应该做什么?前三个for循环似乎什么都不做。 –

+0

好吧,我正在处理一个由多个子列表组成的主列表,每个子列表都是一个值列表。我现在正在处理的部分是将每个子列表更改为一个集合并将这些集合相交。为了测试这个程序,我确保有一个匹配。 – thephfactor

回答

15

我认为你只是在寻找:

set(thingList1) & set(thingList2) & set(thingList3) 

和符号是在Python路口(和一些其他语言好)。

4
set1 & set2 & set3 

应该工作...至少我觉得

>>> set((1,2,3)) & set((2,3,4)) & set((3,4,5)) 
set([3]) 
2

你需要的东西是这样的:

frozenset(list1) & frozenset(list2) & frozenset(list1) 
+0

这两行在功能上并不相同。第二个相当于三组的联合。 – Dunes

+0

@Dunes,确切地说,我是一个白痴...... – defuz

1

的集列表,你说呢?

In [1]: mylist = [ [1, 2, 3, 4], [3, 4, 5, 6, 7], [2, 3, 4, 5, 6] ] 

In [2]: result = set(mylist[0]) 

In [3]: for item in mylist: 
    ...:  result = result.intersection(item) 
    ...:  
    ...:  

In [4]: result 
Out[4]: set([3, 4]) 
+1

从技术上讲,这是一个列表清单。但它也将工作的集合列表 – inspectorG4dget

1
set.intersection(*map(set,d3)) 

威尔实际工作,但因为d3已经包含集,你可以这样做:

set.intersection(*d3) 

而且,事实上,只有第一个必须是一个set - 中其他人可以是任何可迭代的,并且intersection将自行开始。

您遇到似乎并没有在这段代码的问题 - 相反,

for list1 in masterlist: 
    list1 = thingList1 

实际上不会将任何东西放入thingList1。这是很难说没有看到什么masterlist的样子,但你可能要像:

for list1 in masterlist: 
    thingList1[:] = list1 

print你的三个列表你做的路口,以确保它们包含你的期望了。

+0

我试过你的解决方案,它给了我一个TypeError:descriptor'intersection'需要'set'对象,但收到'list' – thephfactor

+0

@thephfactor,因为我打印它。尝试固定版本 - 'set.intersection(* d3)'。 – lvc

0

这应该做的伎俩:

reduce(lambda x,y: x&y, mysetlist)