Python - Создать новый подсписок между двумя элементами в упорядоченном списке - PullRequest
0 голосов
/ 14 февраля 2020

Учитывая два элемента в упорядоченном списке, я хочу создать новый список, состоящий из всего, что находится между этими элементами (включая их). Проблема возникает, если вторая точка находится перед первой точкой в ​​списке. справа мой существующий отсортированный список объектов. rt - начальная граница, а rb - конечная граница. new_right = right[right.index(rt): right.index(rb) + 1]

Этот фрагмент работает за исключением случая

right = [a, rb, c, rt, d, e]

, где я получаю [rt, d, e] вместо обернутого [rt, d, e, a, rb]

Есть ли способ сделать это без создания сложного метода? Проблемы некоторых людей были решены путем понимания списка. Посмотрев на это, я смог придумать

begin = right.index(rt)
end = right.index(rb)
if end > begin:
    new_right = right[begin: end + 1]
else:
    new_right = [right[i % r_len] for i in range(begin, r_len + end + 1)]

, который мне кажется довольно уродливым, но, похоже, выдерживает мои тесты. Есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ: было два рабочих решения для этого.

rbegin = right.index(rt)
rend = right.index(rb)
if rend >= rbegin:
    new_right = right[rbegin: rend + 1]
else:
    new_right = [right[i % r_len] for i in range(rbegin, r_len + rend + 1)]

Что непристойно сложно по сравнению с:

if rend > rbegin:
    new_right = right[rbegin: rend + 1]
else:
    new_right = right[rbegin:] + right[:rend + 1]

Ответы [ 3 ]

1 голос
/ 14 февраля 2020

Может быть, это?

new_right = right[begin: end + 1] if end > begin else right[begin:] + right[:end + 1]
1 голос
/ 14 февраля 2020

Вы можете добавить конечные и ведущие фрагменты вместо использования понимания. Используя вашу структуру кода:

begin = right.index(rt)
end = right.index(rb)
if end > begin:
    new_right = right[begin: end + 1]
else:
    new_right = right[begin:] + right[:end + 1]
1 голос
/ 14 февраля 2020

Было бы просто перевернуть срез, чтобы соответствовать вашим тестам так:

begin = right.index(rt)
end = right.index(rb)
if end > begin:
    new_right = right[begin: end + 1]
else:
    new_right = right[end: begin + 1]
...