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