Python:如何获取只出现在集合列表的一个集合中的项?

2024-09-30 02:14:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个函数,它接受一个或多个集合的列表,并找到列表中所有集合的对称差,即结果应该是一组值,每个值只包含在一个单独的集合中。(如果我认为这是对称差,请纠正我。)

例如:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s3 = set([2, 3, 7])
>>> s4 = set([2, 5, 9])
>>> myfunc([s1, s2, s3, s4])
{1, 4, 5, 7, 9}

有什么内置的东西可以在上面代替myfunc使用吗?或者我用这样的方法:

def myfunc(sets: List[set]) -> set:

    sd = set()
    goners = set()
    for s in sets:
        still_ok = s - goners
        sd = sd.symmetric_difference(still_ok)
        goners = goners.union(s.difference(sd))
    return sd

有没有更好的/更有效的/“Pythonic”方法?你知道吗


Tags: 方法函数列表s3setsoksdmyfunc
3条回答

对于可以使用操作符和函数对内置Python对象执行的操作,操作符版本通常比函数版本快,因为在访问实例属性和进行显式函数调用时会有开销。另外,对集合执行就地更新可以避免创建额外的数据副本,并提高程序的效率。你知道吗

使用集合运算符的方法的改进版本如下所示:

def myfunc_improved(sets: List[set]) -> set:
    sd = set()
    goners = set()
    for s in sets:
        sd ^= s - goners
        goners |= s - sd
    return sd

性能测量:

%timeit myfunc(sets)
%timeit myfunc_improved(sets)

3.19 µs ± 34.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.75 µs ± 11.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

你想要一个集合B包含所有成员,这些成员只包含在a中的一个集合中?你知道吗

from functools import reduce
A = [set([1, 2, 3]), set([2, 3, 4]), set([2, 3, 7]), set([2, 5, 9])]
B = set()
for i in range(len(A)):
    U = reduce(set.union, A[:i]+A[(i+1):])
    B = B.union(set.difference(A[i], U))

print(B)

{1, 4, 5, 7, 9}

首先,是的,你的观察是错误的,多个集合的对称差不是只出现在单个集合中的元素集合,而是所有集合中总数为奇数的元素集合,因此(s1,s2,s3,s4)的对称差将是{1,3,4,5,7,9}。你知道吗

def s_diff(li):
    res=set()
    for s in li:
        res =res.symmetric_difference(s)
    return res


output:
s_diff([s1,s2,s3,s4])
{1, 3, 4, 5, 7, 9}

相关问题 更多 >

    热门问题