我有行Lines=([('B', 'C'), ('D', 'A'), ('D', 'C'), ('A', 'B'), ('D', 'B')])
的列表,而geometry = ('B', 'C', 'D')
是设置三角形(B,C,D)
的点的列表。
我想检查是否可以从geometry
的行列表中设置Lines
。如何创建一个功能来检查该状态? True
或False
。
输入行示例功能:
>> 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 :
geometry
的check_geometry
参数可以是任何可迭代的(元组,列表,字符串):check_geometry(lines, "BCD") == check_geometry(lines, ('B', 'C', 'D'))
在这种情况下,创建并传递
tuple
似乎有些奇怪(可惜,您可能有充分的理由这样做)。除非有必要,否则我建议将字符串用作geometry
参数的值。关于python - 检查三角形的几何形状是否包含在线列表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34700948/