pythonic способ проверки конечных точек списка по двум наборам допустимых записей

#python

#python

Вопрос:

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

Какой самый питонический способ убедиться, что две конечные точки списка «path» в приведенном выше коде содержат элемент как в «endpoint1», так и в «endpoint2»

Что-то вроде этого, но красивее:

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

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



  

Ответ №1:

Ну, вы можете сделать все это в одном выражении.

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

Я не думаю, что это станет намного лучше, чем это.

Комментарии:

1. подводя итог, я воспользуюсь этим, если это самый краткий способ сделать это.

Ответ №2:

Если допустимых конечных точек всего несколько, и вы хотите протестировать много путей, то предварительная генерация всех возможных пар конечных точек может оказаться не слишком дорогостоящей:

 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!'
  

Ответ №3:

В зависимости от того, в скольких разных местах вы выполняете эту проверку, самым простым способом, вероятно, будет создание функции, которая будет использоваться следующим образом:

 if valid_path(path):
    print "valid"
  

Затем внутренности valid_path могут быть реализованы так, как вам нравится (разумным выбором были бы как ответ Джона, так и ответ pillmuncher), но читателям кода, фактически запрашивающим проверки достоверности, не нужно беспокоиться об этих деталях.

Ответ №4:

Если ваша цель — СОЗДАТЬ список с именем 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) заключается в случайном получении (endpoint1, endpoint2) или (endpoint2, endpoint1), следовательно , пути[0], находящегося в endpoint1 ИЛИ находящегося в endpoint2, в то время как путь [-1] является другим списком конечных точек