我如何强加一个集合中*任何两个*成员必须满足的条件?

How do I impose a condition that must be satisfied by *any two* members of a set?

我想用python根据另一个集合来定义一个集合,如下所示:对于一些由集合组成的集合N,将C定义为使得N的元素n在C中的集合以防万一 n 的任何两个 元素都满足某些特定条件。

这是我需要解决的特定问题。考虑 x={1,2,3,4,5,6} 中有序元素对集合的幂集 N,以及 N 的以下子集:

i = {{1,1},{2,2},{3,4},{4,3},{5,6},{6,5}}

j = {{3,3},{4,4},{1,2},{2,1},{5,6},{6,5}}

k = {{5,5},{6,6},{1,2},{2,1},{3,4},{4,3}}

使用 python,我想定义一个特殊的 class N 的子集:N 的子集使得它们的任意两个成员都在 i、j 或 k 中。

更明确地说,我想定义集合项:C = {n in N|对于 n 中的所有 a,b,要么 a 和 b 都在 i 中,要么 a 和 b 都在 j 中,要么 a 和 b 都在 k}.

我附上了我在 Python 中尝试做的事情。但这并没有给我正确的结果:我在这里定义的集合 C 并不是它的任何两个成员都在 i、j 或 k 中。

任何线索将不胜感激!

import itertools

def powerset(iterable):

    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

x = [1,2,3,4,5,6]


ordered_pairs = [[j,k] for j in x for k in x if k>=j]

powers = list(powerset(ordered_pairs))

i = [[1,1],[2,2],[3,4],[4,3],[5,6],[6,5]]
j = [[3,3],[4,4],[1,2],[2,1],[5,6],[6,5]]
k = [[5,5],[6,6],[1,2],[2,1],[3,4],[4,3]]

M = [i,j,k]

C = []

for n in powers:
    for a in n: 
        for b in n:
            for m in M:
                if a in m:
                    if b in m:
                        if a != b:
                            C.append(n)
                        if len(n) == 1:
                            C.append(n)

首先请注意,您列出的有序对是集合,而不是对。使用元组,因为它们是可散列的,您将能够使用 itertools 轻松生成幂集。完成后,您可以更轻松地识别符合条件的子集。

下面的代码实现了大部分过程。您可以在 HIT 行代码处累积命中。更好的是,您可以使用 any 迭代三个 zone 集合,将循环折叠成嵌套理解。

test_list = [
    set(((1,1),(2,2))),                     # trivial hit on i
    set(),                                  # trivial miss
    set(((1, 1), (4, 4), (6, 6))),          # one element in each target set
    set(((3, 3), (6, 2), (4, 4), (2, 2))),  # two elements in j
]

i = set(((1,1),(2,2),(3,4),(4,3),(5,6),(6,5)))
j = set(((3,3),(4,4),(1,2),(2,1),(5,6),(6,5)))
k = set(((5,5),(6,6),(1,2),(2,1),(3,4),(4,3)))

zone = [i, j, k]

for candidate in test_list:
    for target in zone:
        overlap = candidate.intersection(target)    
        if len(overlap) >= 2:
            print("HIT", candidate, target)
            break
    else:
        print("MISS", candidate)

输出:

HIT {(1, 1), (2, 2)} {(5, 6), (4, 3), (2, 2), (3, 4), (1, 1), (6, 5)}
MISS set()
MISS {(4, 4), (1, 1), (6, 6)}
HIT {(6, 2), (3, 3), (4, 4), (2, 2)} {(1, 2), (3, 3), (5, 6), (4, 4), (2, 1), (6, 5)}