【问题标题】:intersection of three sets in python?python中三组的交集?
【发布时间】:2012-09-29 04:21:30
【问题描述】:

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

这是我目前所拥有的:

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

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

【问题讨论】:

  • 您的问题似乎暗示输出是一个问题,或意外。输出是否与问题相关?你确定每个列表都有一些共同的元素吗?
  • 代码的第一部分应该做什么?前三个 for 循环似乎什么也没做。
  • 好的,我正在处理一个由几个子列表组成的主列表,每个子列表都是一个值列表。我现在正在处理的部分是将每个子列表更改为一个集合并与这些集合相交。为了测试这个程序,我确保有一个匹配项。
  • 好的,非常感谢您的帮助。事实证明,是我愚蠢的 for 循环搞砸了一切。我需要做的就是 set(masterlist[1]) 来获得我想要的集合。

标签: python intersection set set-intersection


【解决方案1】:

我认为您只是在寻找:

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

& 符号在 Python(以及其他一些语言)中是交集。

【讨论】:

    【解决方案2】:
    set1 & set2 & set3
    

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

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

    【讨论】:

      【解决方案3】:
      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你的三个列表在你做交叉之前确保它们包含你所期望的。

      【讨论】:

      • 我尝试了你的解决方案,它给了我一个 TypeError: descriptor 'intersection' requires a 'set' object but recieved a 'list'
      • @thephfactor 因为我打错了。试试固定版本 - set.intersection(*d3)
      【解决方案4】:

      你是说集合列表?

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

      【讨论】:

      • 从技术上讲,这是一个列表列表。但它也适用于集合列表
      • 当它是一个集合列表时,这非常适合我的用例
      【解决方案5】:

      你需要这样的东西:

      frozenset(list1) & frozenset(list2) & frozenset(list1)
      

      【讨论】:

      • 这两行在功能上并不等同。第二个相当于三个集合的并集。
      【解决方案6】:

      这应该可以解决问题:

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

      【讨论】:

        猜你喜欢
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2020-01-24
        • 2018-08-27
        • 2022-11-27
        • 2023-03-18
        • 2015-02-06
        相关资源
        最近更新 更多