我如何强加一个必须由集合的*任何两个*成员满足的条件?
Posted
技术标签:
【中文标题】我如何强加一个必须由集合的*任何两个*成员满足的条件?【英文标题】:How do I impose a condition that must be satisfied by *any two* members of a set? 【发布时间】:2019-11-21 17:23:00 【问题描述】:我想用 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,我想定义一个特殊的 N 子集类:N 的子集使得它们的任何两个成员都在 i、j 或 k 中。
更明确地说,我想定义集合项:C = n in N|对于所有 a、b 在 n 中,要么 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)
【问题讨论】:
你的预期输出是什么 C 应该有像 [[1,2],[3,4],[5,6]] 这样的元素。 (我不想把它作为输出,但用它来定义我可以作为输出的其他东西。) 【参考方案1】:首先,请注意您列出的有序对是集合,而不是对。使用元组,因为它们是可散列的,您将能够使用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)
【讨论】:
以上是关于我如何强加一个必须由集合的*任何两个*成员满足的条件?的主要内容,如果未能解决你的问题,请参考以下文章