繁体   English   中英

以两组有效条目检查列表端点的pythonic方法

[英]pythonic way of checking endpoints of a list against two sets of valid entries


endpoint1 = [1,2,3]
endpoint2 = [4,5,6]
path = list(random.randrange(0,9) for x in range(10))

确保上述代码中“路径”列表的2个端点包含“endpoint1”和“endpoint2”中的元素的最pythonic方法是什么

像这样的东西,但更漂亮:


if path[0] in endpoint1:
    if path[-1] in endpoint2:
        print "valid"

if path[0] in endpoint2:
    if path[-1] in endpoint1:
        print "valid"



那么你可以在一个表达式中完成整个事情。

if path[0] in endpoint1 and path[-1] in endpoint2 or \
   path[0] in endpoint2 and path[-1] in endpoint1:

我认为它不会比这更好。

如果有效端点只有少数并且您想要测试多个路径,那么预先生成所有可能的端点对可能不会太昂贵:

import itertools

valid_endpoints = set(itertools.product([1, 2, 3], [4, 5, 6]))
valid_endpoints.update([(b, a) for (a, b) in valid_endpoints])

many_paths = ... # get many paths from somewhere

for path in many_paths:
    if (path[0], path[-1]) in valid_endpoints:
        print 'valid!'

根据您执行此检查的不同位置,最明确的方法可能是创建要使用的函数,如下所示:

if valid_path(path):
    print "valid"

然后可以实现valid_path的内部结构(John的答案和pillmuncher都是合理的选择),但实际请求有效性检查的代码的读者不需要担心这些细节。

如果您的目标是创建一个名为path的列表来验证表达的需求,您可以:

endpoint1 = [1,2,3]
endpoint2 = [4,5,6]
path = map(random.choice, random.sample((endpoint1,endpoint2),2))
path[1:1] = list(random.randrange(0,9) for x in range(8))

random.sample((endpoint1,endpoint2),2)是得到在随机(端点1,端点2)(端点2,端点1),因此路径[0]端点1是OR在端点2被同时路径[-1]是另一端点名单

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM