我如何强加一个集合中*任何两个*成员必须满足的条件?
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)}
我想用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)}