如何用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
相关产品推荐
相关产品推荐

