That looks fine to me, since looking at the code conveys its meaning well. What I would suggest is that you avoid the double not though:
disjoint = s.isdisjoint(test)
if disjoint:
return False
This might make the logic a bit easier to follow. And once you have that, you can also get rid of that variable and just check the isdisjoint value directly:
if s.isdisjoint(test):
return False
That’s where I would leave it at, to keep the logic easy to follow.
If you really wanted, you could shorten it to a single line though:
def match(ss, test):
return all(not s.isdisjoint(test) for s in ss)
As for performance or correctness, you won’t be able to get better than this with these requirements: In order to tell whether any element of one set (test) is included in every set from a list of sets, you will have to check each of those sets. So that justifies your loop over those sets. And when you are looking for an intersection of two sets, then using the standard set operations will be as good as you can get.
If you had more specialized requirements, or some longer series of tests where you could make some assumptions from earlier test results (e.g. by ordering your test sets in some way or another), then there might be some further optimizations but if we’re just looking a single test using match, then I would think that you are already optimized enough that you shouldn’t need to worry about it.