我有行Lines=([('B', 'C'), ('D', 'A'), ('D', 'C'), ('A', 'B'), ('D', 'B')])的列表,而geometry = ('B', 'C', 'D')是设置三角形(B,C,D)的点的列表。

我想检查是否可以从geometry的行列表中设置Lines。如何创建一个功能来检查该状态? TrueFalse

输入行示例功能:

>> Lines=([('B', 'C'), ('D', 'A'), ('D', 'C'), ('A', 'B'), ('D', 'B'),])
>> geometry1 = ('B', 'C', 'D')
>> check_geometry(Lines, geometry1)
   True
>> geometry2 = ('A', 'B', 'E')
>> check_geometry(Lines, geometry2)
   False

这是我的代码,但是结果是错误的:
import itertools

def check_geometry(line, geometry):
    dataE = [set(x) for x in itertools.combinations(geometry, 2)]
    for data in dataE:
       if data not in line:
           return False
    return True

Lines = [('B', 'C'), ('D', 'A'), ('D', 'C'), ('A', 'B'), ('D', 'B'),]
geometry1 = ('B', 'C', 'D')
print check_geometry(Lines, geometry1)

输出:
False

最佳答案

对于三角形:

您可以使用内置的 all 来执行此操作,请确保首先对列表内容进行排序,因为它们的顺序可能与从 itertools.combinations 生成的顺序不同:

sLines = [tuple(sorted(l)) for l in Lines]
dataE = itertools.combinations('BCD', 2)

现在,您可以调用all,它将检查dataE中是否存在sLines中的每个值:
all(l1 in sLines for l1 in dataE)

它将返回True

因此,您的check_geometry函数可能类似于:
def check_geometry(line, geometry):
    sLines = [tuple(sorted(l)) for l in line]
    dataE = itertools.combinations(geometry, 2)
    return all(l1 in sLines for l1 in dataE)

现在,发出的调用将检查Lines是否包含geometry:
check_geometry(Lines, 'BCD')
# returns True

check_geometry(Lines, 'ABE')
# returns False

更一般一些:

为了概括这一点,我们可以删除itertools.combinations,而使用zip。下面对函数进行了一些适当的更改,以适应zip但执行类似的操作:
def check_geometry(line, geometry):
    sLines = [sorted(l) for l in line]
    dataE = [sorted(x) for x in zip(geometry, geometry[1:] + geometry[:1])]
    return all(l1 in sLines for l1 in dataE)

这里的主要区别是:
dataE现在是包含zip(geometry, geometry[1:] + geometry[:1])结果的列表的列表。在这种情况下zip要做的是,它需要一个类似于"BCDA"的字符串,并且将第一个元素添加到geometry[1:] + geometry[:1]的末尾(即"CDAB"),并创建相同的字符串,并创建表示形状各边的条目:
>>> s = "BCDA"

>>> s[1:] + s[:1]
>>> 'CDAB'

>>> list(zip(s, s[1:] + s[:1]))
[('B', 'C'), ('C', 'D'), ('D', 'A'), ('A', 'B')]

现在我们可以检查"BCDA"中的线是否可以构造点Lines的几何体:
check_geometry(Lines, "BCD")
# True

check_geometry(Lines, "BCDA")
# True

check_geometry(Lines, "BCDF")
# False

注1 :Lines可以写为:
Lines=[('B', 'C'), ('D', 'A'), ('D', 'C'), ('A', 'B'), ('D', 'B')]

括号()和逗号,在这里没有其他作用,您可以将它们删除:-)。

注2 :geometrycheck_geometry参数可以是任何可迭代的(元组,列表,字符串):
check_geometry(lines, "BCD") == check_geometry(lines, ('B', 'C', 'D'))

在这种情况下,创建并传递tuple似乎有些奇怪(可惜,您可能有充分的理由这样做)。除非有必要,否则我建议将字符串用作geometry参数的值。

关于python - 检查三角形的几何形状是否包含在线列表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34700948/

10-12 20:10