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

1

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

Какой самый питонический способ убедиться, что 2 конечных точки списка "путь" в приведенном выше коде содержат элемент как "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"




Теги:

4 ответа

2
Лучший ответ

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

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

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

  • 0
    Я пойду с этим, если это будет самый краткий способ сделать это.
1

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

if valid_path(path):
    print "valid"

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

1

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

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

Если ваша цель - СОЗДАТЬ список с именем путь, проверяющий выраженное требование, вы можете сделать:

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), следовательно path [0] находится в endpoint1 ИЛИ находится в endpoint2, тогда как путь [-1] - это другой список конечных точек

Ещё вопросы

Сообщество Overcoder
Наверх
Меню