7

目前我被困在试图找到三组的交集。现在这些集合实际上是我正在转换成集合的列表,然后试图找到它们的交集。

这是我到目前为止所拥有的:

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

仍然没有给我我正在寻找的东西:这是我确保在每个列表中的一个匹配项。它给了我看起来像是所有集合的添加。

4

6 回答 6

30

我认为您只是在寻找:

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

与号是 Python(以及其他一些语言)中的交集。

于 2012-10-08T21:38:25.230 回答
4
set1 & set2 & set3

应该工作......至少我认为

>>> set((1,2,3)) & set((2,3,4)) & set((3,4,5))
set([3])
于 2012-10-08T21:37:40.973 回答
3
set.intersection(*map(set,d3)) 

实际上会起作用,但因为d3已经包含你可以做的集合:

set.intersection(*d3)

而且,事实上,只有第一个需要是 a set- 其他可以是任何可迭代的,并且intersection会自行设置它们。

您遇到的问题似乎不在此代码中 - 相反,

for list1 in masterlist:
    list1 = thingList1

实际上不会将任何东西放入thingList1. 如果不看外观就很难分辨masterlist,但您可能想要类似的东西:

for list1 in masterlist:
   thingList1[:] = list1

print在你做交叉点之前你的三个列表,以确保它们包含你所期望的。

于 2012-10-08T21:50:19.443 回答
2

你需要这样的东西:

frozenset(list1) & frozenset(list2) & frozenset(list1)
于 2012-10-08T21:39:01.290 回答
2

你说的是一组列表?

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])
于 2012-10-08T21:41:49.763 回答
2

这应该可以解决问题:

reduce(lambda x,y: x&y, mysetlist)
于 2014-03-27T18:22:20.837 回答