Python-在有序列表的两个元素之间创建一个新的子列表

时间:2020-02-14 08:08:40

标签: python-3.x list slice circular-list

给定一个有序列表中的两个元素,我想创建一个新列表,其中包括这些元素之间(包括它们)的所有内容。 如果第二点在列表中的第一点之前,则会出现问题。 右边是我现有的对象排序列表。 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 个答案:

答案 0 :(得分:1)

只需按以下方式翻转切片即可匹配您的测试:

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

答案 1 :(得分:1)

也许是吗?

new_right = right[begin: end + 1] if end > begin else right[begin:] + right[:end + 1]

答案 2 :(得分:1)

您可以添加结尾部分和开头部分,而无需使用理解。使用您的代码结构:

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]