You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python集合推导式按布尔条件生成目标元素对集合?

问题与实现方案

问题描述

我有一个包含三个元素的frozenset集合F = {v0, v1, v2},以及一个由二元frozenset组成的集合E = {e0, e1, e2, ...}(每个ei都是形如frozenset({x,y})的二元集合)。需要生成集合S,满足以下规则:

S = {frozenset({a,b}) : a,b ∈ E,a和b分别包含F中的不同元素,且a和b共享一个元素}

示例:若a包含v0,b包含v1,且两者都包含F外的元素v7,则frozenset({a,b})属于S。需求是用一行集合推导式实现这个逻辑。

背景代码(八面体三角剖分脚本)

import pylab as plt
import numpy as np
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

### 初始八面体定义 ###
Vertices = [ [0,0,1], [1,0,0], [0,1,0], [-1,0,0], [0,-1,0], [0,0,-1] ]
Edges = { frozenset({0,1}), frozenset({0,2}), frozenset({0,3}), frozenset({0,4}),
          frozenset({1,2}), frozenset({2,3}), frozenset({3,4}), frozenset({1,4}),
          frozenset({1,5}), frozenset({2,5}), frozenset({3,5}), frozenset({4,5}) }
Faces = { frozenset({0,1,2}), frozenset({0,2,3}), frozenset({0,3,4}), frozenset({0,1,4}),
          frozenset({1,2,5}), frozenset({2,3,5}), frozenset({3,4,5}), frozenset({1,4,5}) }

### 生成新的顶点、边、面集合 ###
counter = 5
newVertices = set()
newEdges = set()
newFaces = set()

# 添加新顶点与新边
for edge in Edges:
    counter += 1
    newVertices.add(counter)
    for vertex in edge:
        newEdges.add(frozenset({vertex, counter}))

一行集合推导式实现

直接使用以下集合推导式即可生成目标集合S:

S = {frozenset({a, b}) for a in E for b in E if a != b and len(a & b) == 1 and len(a & F) == 1 and len(b & F) == 1 and (a & F) != (b & F)}

条件解释

  • a != b:避免将同一条边与自身配对
  • len(a & b) == 1:确保两条边共享且仅共享一个顶点(因为都是二元集合,交集长度为1即满足共享一个元素的要求)
  • len(a & F) == 1 和 len(b & F) == 1:确保每条边恰好包含F中的一个元素
  • (a & F) != (b & F):确保两条边包含的F中元素互不相同

适配八面体代码的示例

假设你定义的F是八面体的某三个顶点(比如F = frozenset({0,1,2})),直接将E替换为你的Edges或newEdges集合,即可生成对应的S集合。

内容的提问来源于stack exchange,提问作者Ama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:36:21