代码之家  ›  专栏  ›  技术社区  ›  Ama

如何在Python集合理解中根据布尔语句添加元素对?

  •  -1
  • Ama  · 技术社区  · 1 年前

    我有一个由三个元素F={v0,v1,v2}组成的frozenset和一组由两个元素组成的frozenset,即e={e0,e1,e2,…},其中每个ei=frozenset({x,y})。我想找到以下集合

    S={frozenset({a,b}):E中的a,b,a和b各自包含F的不同元素,并且a和b共享一个元素}。

    例如:a包含v0,b包含v1,a和b都包含v7(某个不在F中的任意值)意味着frozenset({a,b})在S中。

    我可以用一行集合的理解来做这件事吗?

    就上下文而言,我正试图编写一个脚本来完善八面体三角测量,如图所示:

    algorithm

    我想要的集合S将是绿色文本。

    到目前为止,我有以下内容:

    import pylab as plt
    import numpy as np
    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    
    ### Initial octahedron ###
    
    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}) }
    
    ### New set of vertices, edges, and faces ###
    
    counter=5
    
    newVertices=set()
    newEdges=set()
    newFaces=set()
    
    for edge in Edges: # adding elements of newVertices and newEdges
        counter=counter+1
        newVertices.add(counter)
        for vertex in edge:
            newEdges.add(frozenset({vertex,counter}))
    
    1 回复  |  直到 1 年前
        1
  •  -1
  •   Andrej Kesely    1 年前

    IIUC您可以做到:

    from itertools import combinations
    
    F = {1, 2, 3}
    E = {frozenset([1, 2]), frozenset([2, 3]), frozenset([3, 4]), frozenset([3, 5])}
    
    print([(a, b) for a, b in combinations({s for s in E if s - F}, 2) if a & b])
    

    打印:

    [(frozenset({3, 4}), frozenset({3, 5}))]
    

    说明:

    与:

    F = {1, 2, 3}
    E = {frozenset([1, 2]), frozenset([2, 3]), frozenset([3, 4]), frozenset([3, 5])}
    

    我正试图从集合中找到两个蛙类的组合 E 共享共同元素 具有一些不同于中元素的元素 F